aboutsummaryrefslogtreecommitdiffstats
path: root/src/chunk_mmap.c
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2016-05-05 17:45:02 -0700
committerJason Evans <jasone@canonware.com>2016-05-05 18:56:17 -0700
commitc2f970c32b527660a33fa513a76d913c812dcf7c (patch)
treeb0593fac905797fa543ac77aa5ebd9e1160cb67f /src/chunk_mmap.c
parentdc391adc6577b4ed0dac0ce3b1778473e67e4c17 (diff)
downloadplatform_external_jemalloc_new-c2f970c32b527660a33fa513a76d913c812dcf7c.tar.gz
platform_external_jemalloc_new-c2f970c32b527660a33fa513a76d913c812dcf7c.tar.bz2
platform_external_jemalloc_new-c2f970c32b527660a33fa513a76d913c812dcf7c.zip
Modify pages_map() to support mapping uncommitted virtual memory.
If the OS overcommits: - Commit all mappings in pages_map() regardless of whether the caller requested committed memory. - Linux-specific: Specify MAP_NORESERVE to avoid unfortunate interactions with heuristic overcommit mode during fork(2). This resolves #193.
Diffstat (limited to 'src/chunk_mmap.c')
-rw-r--r--src/chunk_mmap.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/src/chunk_mmap.c b/src/chunk_mmap.c
index e2e66bc9..f95ae756 100644
--- a/src/chunk_mmap.c
+++ b/src/chunk_mmap.c
@@ -16,18 +16,16 @@ chunk_alloc_mmap_slow(size_t size, size_t alignment, bool *zero, bool *commit)
do {
void *pages;
size_t leadsize;
- pages = pages_map(NULL, alloc_size);
+ pages = pages_map(NULL, alloc_size, commit);
if (pages == NULL)
return (NULL);
leadsize = ALIGNMENT_CEILING((uintptr_t)pages, alignment) -
(uintptr_t)pages;
- ret = pages_trim(pages, alloc_size, leadsize, size);
+ ret = pages_trim(pages, alloc_size, leadsize, size, commit);
} while (ret == NULL);
assert(ret != NULL);
*zero = true;
- if (!*commit)
- *commit = pages_decommit(ret, size);
return (ret);
}
@@ -54,7 +52,7 @@ chunk_alloc_mmap(void *new_addr, size_t size, size_t alignment, bool *zero,
assert(alignment != 0);
assert((alignment & chunksize_mask) == 0);
- ret = pages_map(new_addr, size);
+ ret = pages_map(new_addr, size, commit);
if (ret == NULL || ret == new_addr)
return (ret);
assert(new_addr == NULL);
@@ -66,8 +64,6 @@ chunk_alloc_mmap(void *new_addr, size_t size, size_t alignment, bool *zero,
assert(ret != NULL);
*zero = true;
- if (!*commit)
- *commit = pages_decommit(ret, size);
return (ret);
}