From f77cec311e102a46a58402570b43aa74dc5d7ae7 Mon Sep 17 00:00:00 2001 From: David Goldblatt Date: Tue, 10 Mar 2020 08:52:58 -0700 Subject: [PATCH] Decay: Take current time as an argument. This better facilitates testing. --- include/jemalloc/internal/decay.h | 4 ++-- src/arena.c | 11 ++++++++--- src/decay.c | 8 ++++---- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/include/jemalloc/internal/decay.h b/include/jemalloc/internal/decay.h index 6a260fca..df396658 100644 --- a/include/jemalloc/internal/decay.h +++ b/include/jemalloc/internal/decay.h @@ -133,14 +133,14 @@ bool decay_ms_valid(ssize_t decay_ms); * * Returns true on error. */ -bool decay_init(decay_t *decay, ssize_t decay_ms); +bool decay_init(decay_t *decay, nstime_t *cur_time, ssize_t decay_ms); /* * Given an already-initialized decay_t, reinitialize it with the given decay * time. The decay_t must have previously been initialized (and should not then * be zeroed). */ -void decay_reinit(decay_t *decay, ssize_t decay_ms); +void decay_reinit(decay_t *decay, nstime_t *cur_time, ssize_t decay_ms); /* Returns true if the epoch advanced and there are pages to purge. */ bool decay_maybe_advance_epoch(decay_t *decay, nstime_t *new_time, diff --git a/src/arena.c b/src/arena.c index 055b36f1..16be6b1e 100644 --- a/src/arena.c +++ b/src/arena.c @@ -619,7 +619,9 @@ arena_decay_ms_set(tsdn_t *tsdn, arena_t *arena, decay_t *decay, * infrequent, either between the {-1, 0, >0} states, or a one-time * arbitrary change during initial arena configuration. */ - decay_reinit(decay, decay_ms); + nstime_t cur_time; + nstime_init_update(&cur_time); + decay_reinit(decay, &cur_time, decay_ms); arena_maybe_decay(tsdn, arena, decay, decay_stats, ecache, false); malloc_mutex_unlock(tsdn, &decay->mtx); @@ -1846,11 +1848,14 @@ arena_new(tsdn_t *tsdn, unsigned ind, extent_hooks_t *extent_hooks) { goto label_error; } - if (decay_init(&arena->pa_shard.decay_dirty, + nstime_t cur_time; + nstime_init_update(&cur_time); + + if (decay_init(&arena->pa_shard.decay_dirty, &cur_time, arena_dirty_decay_ms_default_get())) { goto label_error; } - if (decay_init(&arena->pa_shard.decay_muzzy, + if (decay_init(&arena->pa_shard.decay_muzzy, &cur_time, arena_muzzy_decay_ms_default_get())) { goto label_error; } diff --git a/src/decay.c b/src/decay.c index 462b9bfe..23d59da9 100644 --- a/src/decay.c +++ b/src/decay.c @@ -21,7 +21,7 @@ decay_deadline_init(decay_t *decay) { } void -decay_reinit(decay_t *decay, ssize_t decay_ms) { +decay_reinit(decay_t *decay, nstime_t *cur_time, ssize_t decay_ms) { atomic_store_zd(&decay->time_ms, decay_ms, ATOMIC_RELAXED); if (decay_ms > 0) { nstime_init(&decay->interval, (uint64_t)decay_ms * @@ -29,7 +29,7 @@ decay_reinit(decay_t *decay, ssize_t decay_ms) { nstime_idivide(&decay->interval, SMOOTHSTEP_NSTEPS); } - nstime_init_update(&decay->epoch); + nstime_copy(&decay->epoch, cur_time); decay->jitter_state = (uint64_t)(uintptr_t)decay; decay_deadline_init(decay); decay->nunpurged = 0; @@ -37,7 +37,7 @@ decay_reinit(decay_t *decay, ssize_t decay_ms) { } bool -decay_init(decay_t *decay, ssize_t decay_ms) { +decay_init(decay_t *decay, nstime_t *cur_time, ssize_t decay_ms) { if (config_debug) { for (size_t i = 0; i < sizeof(decay_t); i++) { assert(((char *)decay)[i] == 0); @@ -49,7 +49,7 @@ decay_init(decay_t *decay, ssize_t decay_ms) { return true; } decay->purging = false; - decay_reinit(decay, decay_ms); + decay_reinit(decay, cur_time, decay_ms); return false; }