From b0c2a28280d363fc85aa8b4fdbe7814ef46cb17b Mon Sep 17 00:00:00 2001
From: Qi Wang <interwq@gwu.edu>
Date: Tue, 25 Apr 2017 14:10:31 -0700
Subject: Use try_flush first in tcache_dalloc.

Only do must_flush if try_flush didn't manage to free anything.
---
 include/jemalloc/internal/tcache_inlines.h | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/include/jemalloc/internal/tcache_inlines.h b/include/jemalloc/internal/tcache_inlines.h
index 5e9a7a0..511fcea 100644
--- a/include/jemalloc/internal/tcache_inlines.h
+++ b/include/jemalloc/internal/tcache_inlines.h
@@ -201,8 +201,11 @@ tcache_dalloc_small(tsd_t *tsd, tcache_t *tcache, void *ptr, szind_t binind,
 	tbin = tcache_small_bin_get(tcache, binind);
 	tbin_info = &tcache_bin_info[binind];
 	if (unlikely(tbin->ncached == tbin_info->ncached_max)) {
-		tcache_bin_flush_small(tsd, tcache, tbin, binind,
-		    (tbin_info->ncached_max >> 1));
+		if (tcache_bin_try_flush_small(tsd, tcache, tbin, binind,
+		    (tbin_info->ncached_max >> 1)) == 0) {
+			tcache_bin_flush_small(tsd, tcache, tbin, binind,
+			    (tbin_info->ncached_max >> 1));
+		}
 	}
 	assert(tbin->ncached < tbin_info->ncached_max);
 	tbin->ncached++;
@@ -227,8 +230,11 @@ tcache_dalloc_large(tsd_t *tsd, tcache_t *tcache, void *ptr, szind_t binind,
 	tbin = tcache_large_bin_get(tcache, binind);
 	tbin_info = &tcache_bin_info[binind];
 	if (unlikely(tbin->ncached == tbin_info->ncached_max)) {
-		tcache_bin_flush_large(tsd, tcache, tbin, binind,
-		    (tbin_info->ncached_max >> 1));
+		if (tcache_bin_try_flush_large(tsd, tcache, tbin, binind,
+		    (tbin_info->ncached_max >> 1)) == 0) {
+			tcache_bin_flush_large(tsd, tcache, tbin, binind,
+			    (tbin_info->ncached_max >> 1));
+		}
 	}
 	assert(tbin->ncached < tbin_info->ncached_max);
 	tbin->ncached++;
-- 
cgit v0.12