summaryrefslogtreecommitdiffstats
path: root/src/extent.c
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2017-03-10 01:20:00 (GMT)
committerJason Evans <jasone@canonware.com>2017-03-14 01:19:57 (GMT)
commit26d23da6cd91e4d7d6210c89de5194dedf0f0f60 (patch)
treea2e1290b0e722c78d7d31006d635941dbe174712 /src/extent.c
parent28078274c4885c5d98cbbb12dd7cb138397cde8f (diff)
downloadjemalloc-26d23da6cd91e4d7d6210c89de5194dedf0f0f60.zip
jemalloc-26d23da6cd91e4d7d6210c89de5194dedf0f0f60.tar.gz
jemalloc-26d23da6cd91e4d7d6210c89de5194dedf0f0f60.tar.bz2
Prefer pages_purge_forced() over memset().
This has the dual advantages of allowing for sparsely used large allocations, and relying on the kernel to supply zeroed pages, which tends to be very fast on modern systems.
Diffstat (limited to 'src/extent.c')
-rw-r--r--src/extent.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/extent.c b/src/extent.c
index 3358939..c44ecb8 100644
--- a/src/extent.c
+++ b/src/extent.c
@@ -759,8 +759,11 @@ extent_recycle(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks,
if (*zero) {
if (!extent_zeroed_get(extent)) {
- memset(extent_addr_get(extent), 0,
- extent_usize_get(extent));
+ if (pages_purge_forced(extent_base_get(extent),
+ extent_size_get(extent))) {
+ memset(extent_addr_get(extent), 0,
+ extent_usize_get(extent));
+ }
} else if (config_debug) {
size_t i;
size_t *p = (size_t *)(uintptr_t)
@@ -971,7 +974,11 @@ extent_grow_retained(tsdn_t *tsdn, arena_t *arena,
extent_interior_register(tsdn, rtree_ctx, extent);
}
if (*zero && !extent_zeroed_get(extent)) {
- memset(extent_addr_get(extent), 0, extent_usize_get(extent));
+ if (pages_purge_forced(extent_base_get(extent),
+ extent_size_get(extent))) {
+ memset(extent_addr_get(extent), 0,
+ extent_usize_get(extent));
+ }
}
/*
* Increment extent_grow_next, but take care to do so atomically and