From d1d7e1076b6132a1faacd10cafaebaee975edb98 Mon Sep 17 00:00:00 2001 From: David Goldblatt Date: Mon, 9 Mar 2020 19:16:34 -0700 Subject: [PATCH] Decay: move in some background_thread accesses. --- include/jemalloc/internal/decay.h | 11 +++++++++++ src/background_thread.c | 8 ++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/include/jemalloc/internal/decay.h b/include/jemalloc/internal/decay.h index b1e80f53..6a260fca 100644 --- a/include/jemalloc/internal/decay.h +++ b/include/jemalloc/internal/decay.h @@ -105,6 +105,17 @@ decay_epoch_npages_delta(const decay_t *decay) { return decay->backlog[SMOOTHSTEP_NSTEPS - 1]; } +/* + * Current epoch duration, in nanoseconds. Given that new epochs are started + * somewhat haphazardly, this is not necessarily exactly the time between any + * two calls to decay_maybe_advance_epoch; see the comments on fields in the + * decay_t. + */ +static inline uint64_t +decay_epoch_duration_ns(const decay_t *decay) { + return nstime_ns(&decay->interval); +} + /* * Returns true if the passed in decay time setting is valid. * < -1 : invalid diff --git a/src/background_thread.c b/src/background_thread.c index 95a8b16c..6b680530 100644 --- a/src/background_thread.c +++ b/src/background_thread.c @@ -121,14 +121,14 @@ arena_decay_compute_purge_interval_impl(tsdn_t *tsdn, decay_t *decay, } uint64_t interval; - ssize_t decay_time = atomic_load_zd(&decay->time_ms, ATOMIC_RELAXED); + ssize_t decay_time = decay_ms_read(decay); if (decay_time <= 0) { /* Purging is eagerly done or disabled currently. */ interval = BACKGROUND_THREAD_INDEFINITE_SLEEP; goto label_done; } - uint64_t decay_interval_ns = nstime_ns(&decay->interval); + uint64_t decay_interval_ns = decay_epoch_duration_ns(decay); assert(decay_interval_ns > 0); size_t npages = ecache_npages_get(ecache); if (npages == 0) { @@ -674,12 +674,12 @@ background_thread_interval_check(tsdn_t *tsdn, arena_t *arena, decay_t *decay, goto label_done; } - ssize_t decay_time = atomic_load_zd(&decay->time_ms, ATOMIC_RELAXED); + ssize_t decay_time = decay_ms_read(decay); if (decay_time <= 0) { /* Purging is eagerly done or disabled currently. */ goto label_done_unlock2; } - uint64_t decay_interval_ns = nstime_ns(&decay->interval); + uint64_t decay_interval_ns = decay_epoch_duration_ns(decay); assert(decay_interval_ns > 0); nstime_t diff;