summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorQi Wang <interwq@gwu.edu>2017-04-21 22:23:14 (GMT)
committerQi Wang <interwq@gmail.com>2017-04-24 20:23:55 (GMT)
commitcf6035e1ee60dd9245b119aadb2ccec592dde27d (patch)
tree72dad64bda13c8e3f78b3627395c615876a27e28 /src
parentf970c497dc5ab2b885d266d59948510c430f8ec1 (diff)
downloadjemalloc-cf6035e1ee60dd9245b119aadb2ccec592dde27d.zip
jemalloc-cf6035e1ee60dd9245b119aadb2ccec592dde27d.tar.gz
jemalloc-cf6035e1ee60dd9245b119aadb2ccec592dde27d.tar.bz2
Use trylock in arena_decay_impl().
If another thread is working on decay, we don't have to wait for the mutex.
Diffstat (limited to 'src')
-rw-r--r--src/arena.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/arena.c b/src/arena.c
index 77f7282..1288b7b 100644
--- a/src/arena.c
+++ b/src/arena.c
@@ -47,7 +47,7 @@ const arena_bin_info_t arena_bin_info[NBINS] = {
static void arena_decay_to_limit(tsdn_t *tsdn, arena_t *arena,
arena_decay_t *decay, extents_t *extents, bool all, size_t npages_limit);
-static void arena_decay_dirty(tsdn_t *tsdn, arena_t *arena, bool all);
+static bool arena_decay_dirty(tsdn_t *tsdn, arena_t *arena, bool all);
static void arena_dalloc_bin_slab(tsdn_t *tsdn, arena_t *arena, extent_t *slab,
arena_bin_t *bin);
static void arena_bin_lower_slab(tsdn_t *tsdn, arena_t *arena, extent_t *slab,
@@ -965,33 +965,41 @@ arena_decay_to_limit(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay,
decay->purging = false;
}
-static void
+static bool
arena_decay_impl(tsdn_t *tsdn, arena_t *arena, arena_decay_t *decay,
extents_t *extents, bool all) {
- malloc_mutex_lock(tsdn, &decay->mtx);
if (all) {
+ malloc_mutex_lock(tsdn, &decay->mtx);
arena_decay_to_limit(tsdn, arena, decay, extents, all, 0);
} else {
+ if (malloc_mutex_trylock(tsdn, &decay->mtx)) {
+ /* No need to wait if another thread is in progress. */
+ return true;
+ }
arena_maybe_decay(tsdn, arena, decay, extents);
}
malloc_mutex_unlock(tsdn, &decay->mtx);
+
+ return false;
}
-static void
+static bool
arena_decay_dirty(tsdn_t *tsdn, arena_t *arena, bool all) {
- arena_decay_impl(tsdn, arena, &arena->decay_dirty,
+ return arena_decay_impl(tsdn, arena, &arena->decay_dirty,
&arena->extents_dirty, all);
}
-static void
+static bool
arena_decay_muzzy(tsdn_t *tsdn, arena_t *arena, bool all) {
- arena_decay_impl(tsdn, arena, &arena->decay_muzzy,
+ return arena_decay_impl(tsdn, arena, &arena->decay_muzzy,
&arena->extents_muzzy, all);
}
void
arena_decay(tsdn_t *tsdn, arena_t *arena, bool all) {
- arena_decay_dirty(tsdn, arena, all);
+ if (arena_decay_dirty(tsdn, arena, all)) {
+ return;
+ }
arena_decay_muzzy(tsdn, arena, all);
}