From 533ffb67e3e8000a059bc9cc86d678b22888f550 Mon Sep 17 00:00:00 2001 From: Slobodan Predolac Date: Thu, 21 May 2026 14:11:26 -0700 Subject: [PATCH] Refactor arena ctl helpers --- src/ctl.c | 95 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 37 deletions(-) diff --git a/src/ctl.c b/src/ctl.c index e048135a..592f764b 100644 --- a/src/ctl.c +++ b/src/ctl.c @@ -981,6 +981,21 @@ ctl_accum_atomic_zu(atomic_zu_t *dst, atomic_zu_t *src) { /******************************************************************************/ +static bool +ctl_arena_ind_is_deprecated_all(size_t i, unsigned narenas) { + /* + * Historical compatibility for treating arena. as the merged + * all-arenas entry. New code should use MALLCTL_ARENAS_ALL. + */ + return i == narenas; +} + +static bool +ctl_arena_ind_is_all(size_t i, unsigned narenas) { + return i == MALLCTL_ARENAS_ALL + || ctl_arena_ind_is_deprecated_all(i, narenas); +} + static unsigned arenas_i2a_impl(size_t i, bool compat, bool validate) { unsigned a; @@ -993,7 +1008,8 @@ arenas_i2a_impl(size_t i, bool compat, bool validate) { a = 1; break; default: - if (compat && i == ctl_arenas->narenas) { + if (compat && ctl_arena_ind_is_deprecated_all( + i, ctl_arenas->narenas)) { /* * Provide deprecated backward compatibility for * accessing the merged stats at index narenas rather @@ -2693,6 +2709,40 @@ label_return: return ret; } +static void +arena_i_decay_all(tsdn_t *tsdn, unsigned narenas, bool all) { + unsigned i; + VARIABLE_ARRAY_UNSAFE(arena_t *, tarenas, narenas); + + for (i = 0; i < narenas; i++) { + tarenas[i] = arena_get(tsdn, i, false); + } + + /* + * No further need to hold ctl_mtx, since narenas and tarenas contain + * everything needed below. + */ + malloc_mutex_unlock(tsdn, &ctl_mtx); + + for (i = 0; i < narenas; i++) { + if (tarenas[i] != NULL) { + arena_decay(tsdn, tarenas[i], false, all); + } + } +} + +static void +arena_i_decay_one(tsdn_t *tsdn, unsigned arena_ind, bool all) { + arena_t *tarena = arena_get(tsdn, arena_ind, false); + + /* No further need to hold ctl_mtx. */ + malloc_mutex_unlock(tsdn, &ctl_mtx); + + if (tarena != NULL) { + arena_decay(tsdn, tarena, false, all); + } +} + static void arena_i_decay(tsdn_t *tsdn, unsigned arena_ind, bool all) { malloc_mutex_lock(tsdn, &ctl_mtx); @@ -2703,39 +2753,11 @@ arena_i_decay(tsdn_t *tsdn, unsigned arena_ind, bool all) { * Access via index narenas is deprecated, and scheduled for * removal in 6.0.0. */ - if (arena_ind == MALLCTL_ARENAS_ALL || arena_ind == narenas) { - unsigned i; - VARIABLE_ARRAY_UNSAFE(arena_t *, tarenas, narenas); - - for (i = 0; i < narenas; i++) { - tarenas[i] = arena_get(tsdn, i, false); - } - - /* - * No further need to hold ctl_mtx, since narenas and - * tarenas contain everything needed below. - */ - malloc_mutex_unlock(tsdn, &ctl_mtx); - - for (i = 0; i < narenas; i++) { - if (tarenas[i] != NULL) { - arena_decay( - tsdn, tarenas[i], false, all); - } - } + if (ctl_arena_ind_is_all(arena_ind, narenas)) { + arena_i_decay_all(tsdn, narenas, all); } else { - arena_t *tarena; - assert(arena_ind < narenas); - - tarena = arena_get(tsdn, arena_ind, false); - - /* No further need to hold ctl_mtx. */ - malloc_mutex_unlock(tsdn, &ctl_mtx); - - if (tarena != NULL) { - arena_decay(tsdn, tarena, false, all); - } + arena_i_decay_one(tsdn, arena_ind, all); } } } @@ -2920,8 +2942,7 @@ arena_i_dss_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp, * 6.0.0. */ dss_prec_t dss_prec_old; - if (arena_ind == MALLCTL_ARENAS_ALL - || arena_ind == ctl_arenas->narenas) { + if (ctl_arena_ind_is_all(arena_ind, ctl_arenas->narenas)) { if (dss_prec != dss_prec_limit && extent_dss_prec_set(dss_prec)) { ret = EFAULT; @@ -2996,7 +3017,7 @@ arena_i_decay_ms_ctl_impl(tsd_t *tsd, const size_t *mib, size_t miblen, extent_state_t state = dirty ? extent_state_dirty : extent_state_muzzy; if (oldp != NULL && oldlenp != NULL) { - size_t oldval = arena_decay_ms_get(arena, state); + ssize_t oldval = arena_decay_ms_get(arena, state); READ(oldval, ssize_t); } if (newp != NULL) { @@ -3229,8 +3250,8 @@ arenas_decay_ms_ctl_impl(tsd_t *tsd, const size_t *mib, size_t miblen, int ret; if (oldp != NULL && oldlenp != NULL) { - size_t oldval = (dirty ? arena_dirty_decay_ms_default_get() - : arena_muzzy_decay_ms_default_get()); + ssize_t oldval = (dirty ? arena_dirty_decay_ms_default_get() + : arena_muzzy_decay_ms_default_get()); READ(oldval, ssize_t); } if (newp != NULL) {