Update mmap_allocate() to shrink mappings with munmap() (when mremap() doesn't exist)

This commit is contained in:
Justin R. Cutler 2016-04-05 22:28:07 -04:00
parent b66c589d85
commit 31633b0b49
1 changed files with 12 additions and 6 deletions

View File

@ -57,12 +57,18 @@ static void *do_mremap(void *memory, size_t old_size, size_t new_size)
#ifdef HAVE_MREMAP
new_memory = mremap(memory, old_size, new_size, MREMAP_MAYMOVE);
#else
/* slow remap: mmap + copy + munmap */
size_t copy_size = (new_size < old_size) ? new_size : old_size;
new_memory = do_mmap(new_size);
if (MAP_FAILED != new_memory) {
memcpy(new_memory, memory, copy_size);
(void) munmap(memory, old_size);
if (old_size < new_size) {
/* slow remap: mmap + copy + munmap */
size_t copy_size = (new_size < old_size) ? new_size : old_size;
new_memory = do_mmap(new_size);
if (MAP_FAILED != new_memory) {
memcpy(new_memory, memory, copy_size);
(void) munmap(memory, old_size);
}
} else {
/* shrink via munmap */
(void) munmap((char *)memory + new_size, old_size - new_size);
new_memory = memory;
}
#endif
return new_memory;