summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorQi Wang <interwq@gwu.edu>2017-11-15 22:48:55 (GMT)
committerQi Wang <interwq@gmail.com>2017-11-16 23:32:02 (GMT)
commit3e64dae802b9f7cd4f860b0d29126cd727d5166b (patch)
tree79d81bc54c273bcccf647c80f0c6122be7535fff /src
parenteb1b08daaea57d16ce720d97847d94cee2f867cc (diff)
downloadjemalloc-3e64dae802b9f7cd4f860b0d29126cd727d5166b.zip
jemalloc-3e64dae802b9f7cd4f860b0d29126cd727d5166b.tar.gz
jemalloc-3e64dae802b9f7cd4f860b0d29126cd727d5166b.tar.bz2
Eagerly coalesce large extents.
Coalescing is a small price to pay for large allocations since they happen less frequently. This reduces fragmentation while also potentially improving locality.
Diffstat (limited to 'src')
-rw-r--r--src/extent.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/extent.c b/src/extent.c
index 8b00ec9..23b6401 100644
--- a/src/extent.c
+++ b/src/extent.c
@@ -1586,8 +1586,22 @@ extent_record(tsdn_t *tsdn, arena_t *arena, extent_hooks_t **r_extent_hooks,
if (!extents->delay_coalesce) {
extent = extent_try_coalesce(tsdn, arena, r_extent_hooks,
rtree_ctx, extents, extent, NULL, growing_retained);
+ } else if (extent_size_get(extent) >= LARGE_MINCLASS) {
+ /* Always coalesce large extents eagerly. */
+ bool coalesced;
+ size_t prev_size;
+ do {
+ prev_size = extent_size_get(extent);
+ assert(extent_state_get(extent) == extent_state_active);
+ extent = extent_try_coalesce(tsdn, arena,
+ r_extent_hooks, rtree_ctx, extents, extent,
+ &coalesced, growing_retained);
+ if (coalesced) {
+ extent_list_remove(&extents->lru, extent);
+ }
+ } while (coalesced &&
+ extent_size_get(extent) >= prev_size + LARGE_MINCLASS);
}
-
extent_deactivate_locked(tsdn, arena, extents, extent, false);
malloc_mutex_unlock(tsdn, &extents->mtx);