From cdce93e4a3045bcf0d30409666d2d4c29818aec7 Mon Sep 17 00:00:00 2001 From: Jason Evans Date: Fri, 3 Mar 2017 22:55:28 -0800 Subject: [PATCH] Use any-best-fit for cached extent allocation. This simplifies what would be pairing heap operations to the equivalent of LIFO queue operations. This is a complementary optimization in the context of delayed coalescing for cached extents. --- src/extent.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/extent.c b/src/extent.c index 368c9741..60e385ee 100644 --- a/src/extent.c +++ b/src/extent.c @@ -238,17 +238,20 @@ extents_remove_locked(tsdn_t *tsdn, extents_t *extents, extent_t *extent, } /* - * Do first-best-fit extent selection, i.e. select the oldest/lowest extent that - * best fits. + * Do {first,any}-best-fit extent selection, i.e. select the oldest/lowest or + * any extent that best fits, where {first,any} corresponds to + * extents->delay_coalesce={false,true}. */ static extent_t * -extents_first_best_fit_locked(tsdn_t *tsdn, arena_t *arena, extents_t *extents, +extents_best_fit_locked(tsdn_t *tsdn, arena_t *arena, extents_t *extents, size_t size) { malloc_mutex_assert_owner(tsdn, &extents->mtx); pszind_t pind = psz2ind(extent_size_quantize_ceil(size)); for (pszind_t i = pind; i < NPSIZES+1; i++) { - extent_t *extent = extent_heap_first(&extents->heaps[i]); + extent_t *extent = extents->delay_coalesce ? + extent_heap_any(&extents->heaps[i]) : + extent_heap_first(&extents->heaps[i]); if (extent != NULL) { assert(extent_size_get(extent) >= size); return extent; @@ -620,7 +623,7 @@ extent_recycle_extract(tsdn_t *tsdn, arena_t *arena, extent = NULL; } } else { - extent = extents_first_best_fit_locked(tsdn, arena, extents, + extent = extents_best_fit_locked(tsdn, arena, extents, alloc_size); } if (extent == NULL) {