diff --git a/malloc.c b/malloc.c index 2d7b20c..46fa3a7 100644 --- a/malloc.c +++ b/malloc.c @@ -778,7 +778,7 @@ EXPORT void *h_realloc(void *old, size_t size) { regions_delete(region); pthread_mutex_unlock(®ions_lock); - if (mremap(old, PAGE_CEILING(old_size), PAGE_CEILING(size), MREMAP_MAYMOVE|MREMAP_FIXED, new) == MAP_FAILED) { + if (memory_remap_fixed(old, old_size, new, size)) { memcpy(new, old, copy_size); deallocate_pages(old, old_size, old_guard_size); } else { @@ -933,7 +933,7 @@ EXPORT int h_malloc_trim(size_t pad) { for (unsigned i = 0; i < N_SIZE_CLASSES; i++) { struct size_class *c = &size_class_metadata[i]; pthread_mutex_lock(&c->mutex); - // TODO: purge and mprotect all free slabs + // TODO: purge and memory protect all free slabs pthread_mutex_unlock(&c->mutex); } diff --git a/memory.c b/memory.c index 6812d1f..26df14a 100644 --- a/memory.c +++ b/memory.c @@ -31,3 +31,14 @@ int memory_protect(void *ptr, size_t size, int prot) { } return ret; } + +int memory_remap_fixed(void *old, size_t old_size, void *new, size_t new_size) { + void *ptr = mremap(old, old_size, new_size, MREMAP_MAYMOVE|MREMAP_FIXED, new); + if (unlikely(ptr == MAP_FAILED)) { + if (errno != ENOMEM) { + fatal_error("non-ENOMEM mremap failure"); + } + return 1; + } + return 0; +} diff --git a/memory.h b/memory.h index 80fb7db..adc5cba 100644 --- a/memory.h +++ b/memory.h @@ -6,5 +6,6 @@ void *memory_map(size_t size); int memory_unmap(void *ptr, size_t size); int memory_protect(void *ptr, size_t size, int prot); +int memory_remap_fixed(void *old, size_t old_size, void *new, size_t new_size); #endif