Compare commits

...

2 Commits

Author SHA1 Message Date
Gabriel Ebner
374e5ad66a chore: only build small allocator if enabled
This prevents us from calling alloc/dealloc if LEAN_SMALL_ALLOCATOR is
disabled.
2023-01-23 19:11:02 -08:00
Gabriel Ebner
c5d3c43005 fix: mpz: honor LEAN_SMALL_ALLOCATOR 2023-01-23 19:11:02 -08:00
2 changed files with 59 additions and 22 deletions

View File

@@ -31,6 +31,9 @@ LEAN_CASSERT(LEAN_PAGE_SIZE > LEAN_MAX_SMALL_OBJECT_SIZE);
LEAN_CASSERT(LEAN_SEGMENT_SIZE > LEAN_PAGE_SIZE);
namespace lean {
#ifdef LEAN_SMALL_ALLOCATOR
namespace allocator {
#ifdef LEAN_RUNTIME_STATS
static atomic<uint64> g_num_alloc(0);
@@ -391,19 +394,6 @@ extern "C" LEAN_EXPORT void * lean_alloc_small(unsigned sz, unsigned slot_idx) {
return r;
}
/* Helper function for increasing hearbeat even when LEAN_SMALL_ALLOCATOR is not defined */
extern "C" LEAN_EXPORT void lean_inc_heartbeat() {
if (g_heap)
g_heap->m_heartbeat++;
}
uint64_t get_num_heartbeats() {
if (g_heap)
return g_heap->m_heartbeat;
else
return 0;
}
void * alloc(size_t sz) {
sz = lean_align(sz, LEAN_OBJECT_SIZE_DELTA);
LEAN_RUNTIME_STAT_CODE(g_num_alloc++);
@@ -461,11 +451,41 @@ extern "C" LEAN_EXPORT unsigned lean_small_mem_size(void * o) {
return p->m_header.m_obj_size;
}
#endif
void initialize_alloc() {
#ifdef LEAN_SMALL_ALLOCATOR
g_heap_manager = new heap_manager();
init_heap(true);
#endif
}
void finalize_alloc() {
}
#ifndef LEAN_SMALL_ALLOCATOR
LEAN_THREAD_VALUE(uint64_t, g_heartbeat, 0);
#endif
/* Helper function for increasing hearbeat even when LEAN_SMALL_ALLOCATOR is not defined */
extern "C" LEAN_EXPORT void lean_inc_heartbeat() {
#ifdef LEAN_SMALL_ALLOCATOR
if (g_heap)
g_heap->m_heartbeat++;
#else
g_heartbeat++;
#endif
}
uint64_t get_num_heartbeats() {
#ifdef LEAN_SMALL_ALLOCATOR
if (g_heap)
return g_heap->m_heartbeat;
else
return 0;
#else
return g_heartbeat;
#endif
}
}

View File

@@ -259,9 +259,25 @@ std::ostream & operator<<(std::ostream & out, mpz const & v) {
#else
/***** NON GMP VERSION ******/
static void *mpz_alloc(size_t size) {
#ifdef LEAN_SMALL_ALLOCATOR
return alloc(size);
#else
return malloc(size);
#endif
}
static void mpz_dealloc(void *ptr, size_t size) {
#ifdef LEAN_SMALL_ALLOCATOR
dealloc(ptr, size);
#else
free(ptr);
#endif
}
void mpz::allocate(size_t s) {
m_size = s;
m_digits = static_cast<mpn_digit*>(alloc(s * sizeof(mpn_digit)));
m_digits = static_cast<mpn_digit*>(mpz_alloc(s * sizeof(mpn_digit)));
}
void mpz::init() {
@@ -330,7 +346,7 @@ void mpz::init_int64(int64 v) {
void mpz::init_mpz(mpz const & v) {
m_sign = v.m_sign;
m_size = v.m_size;
m_digits = static_cast<mpn_digit*>(alloc(m_size * sizeof(mpn_digit)));
m_digits = static_cast<mpn_digit*>(mpz_alloc(m_size * sizeof(mpn_digit)));
memcpy(m_digits, v.m_digits, m_size * sizeof(mpn_digit));
}
@@ -370,8 +386,9 @@ mpz::mpz(mpz && s):
}
mpz::~mpz() {
if (m_digits)
dealloc(m_digits, sizeof(mpn_digit)*m_size);
if (m_digits) {
mpz_dealloc(m_digits, sizeof(mpn_digit)*m_size);
}
}
void swap(mpz & a, mpz & b) {
@@ -438,7 +455,7 @@ mpz & mpz::operator=(mpz const & v) {
if (v.m_size == m_size) {
memcpy(m_digits, v.m_digits, m_size * sizeof(mpn_digit));
} else {
dealloc(m_digits, sizeof(mpn_digit)*m_size);
mpz_dealloc(m_digits, sizeof(mpn_digit)*m_size);
init_mpz(v);
}
}
@@ -446,19 +463,19 @@ mpz & mpz::operator=(mpz const & v) {
}
mpz & mpz::operator=(char const * v) {
dealloc(m_digits, sizeof(mpn_digit)*m_size);
mpz_dealloc(m_digits, sizeof(mpn_digit)*m_size);
init_str(v);
return *this;
}
mpz & mpz::operator=(unsigned int v) {
dealloc(m_digits, sizeof(mpn_digit)*m_size);
mpz_dealloc(m_digits, sizeof(mpn_digit)*m_size);
init_uint(v);
return *this;
}
mpz & mpz::operator=(int v) {
dealloc(m_digits, sizeof(mpn_digit)*m_size);
mpz_dealloc(m_digits, sizeof(mpn_digit)*m_size);
init_int(v);
return *this;
}
@@ -509,7 +526,7 @@ void mpz::set(size_t sz, mpn_digit const * digits) {
while (sz > 1 && digits[sz - 1] == 0)
sz--;
if (sz != m_size) {
dealloc(m_digits, sizeof(mpn_digit)*m_size);
mpz_dealloc(m_digits, sizeof(mpn_digit)*m_size);
allocate(sz);
}
memcpy(m_digits, digits, sizeof(mpn_digit)*sz);