Refactor arena ctl helpers

This commit is contained in:
Slobodan Predolac 2026-05-21 14:11:26 -07:00
parent 6b24522545
commit 533ffb67e3

View file

@ -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.<narenas> 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 static unsigned
arenas_i2a_impl(size_t i, bool compat, bool validate) { arenas_i2a_impl(size_t i, bool compat, bool validate) {
unsigned a; unsigned a;
@ -993,7 +1008,8 @@ arenas_i2a_impl(size_t i, bool compat, bool validate) {
a = 1; a = 1;
break; break;
default: default:
if (compat && i == ctl_arenas->narenas) { if (compat && ctl_arena_ind_is_deprecated_all(
i, ctl_arenas->narenas)) {
/* /*
* Provide deprecated backward compatibility for * Provide deprecated backward compatibility for
* accessing the merged stats at index narenas rather * accessing the merged stats at index narenas rather
@ -2693,6 +2709,40 @@ label_return:
return ret; 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 static void
arena_i_decay(tsdn_t *tsdn, unsigned arena_ind, bool all) { arena_i_decay(tsdn_t *tsdn, unsigned arena_ind, bool all) {
malloc_mutex_lock(tsdn, &ctl_mtx); 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 * Access via index narenas is deprecated, and scheduled for
* removal in 6.0.0. * removal in 6.0.0.
*/ */
if (arena_ind == MALLCTL_ARENAS_ALL || arena_ind == narenas) { if (ctl_arena_ind_is_all(arena_ind, narenas)) {
unsigned i; arena_i_decay_all(tsdn, narenas, all);
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);
}
}
} else { } else {
arena_t *tarena;
assert(arena_ind < narenas); assert(arena_ind < narenas);
arena_i_decay_one(tsdn, arena_ind, all);
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);
}
} }
} }
} }
@ -2920,8 +2942,7 @@ arena_i_dss_ctl(tsd_t *tsd, const size_t *mib, size_t miblen, void *oldp,
* 6.0.0. * 6.0.0.
*/ */
dss_prec_t dss_prec_old; dss_prec_t dss_prec_old;
if (arena_ind == MALLCTL_ARENAS_ALL if (ctl_arena_ind_is_all(arena_ind, ctl_arenas->narenas)) {
|| arena_ind == ctl_arenas->narenas) {
if (dss_prec != dss_prec_limit if (dss_prec != dss_prec_limit
&& extent_dss_prec_set(dss_prec)) { && extent_dss_prec_set(dss_prec)) {
ret = EFAULT; 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; extent_state_t state = dirty ? extent_state_dirty : extent_state_muzzy;
if (oldp != NULL && oldlenp != NULL) { 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); READ(oldval, ssize_t);
} }
if (newp != NULL) { if (newp != NULL) {
@ -3229,8 +3250,8 @@ arenas_decay_ms_ctl_impl(tsd_t *tsd, const size_t *mib, size_t miblen,
int ret; int ret;
if (oldp != NULL && oldlenp != NULL) { if (oldp != NULL && oldlenp != NULL) {
size_t oldval = (dirty ? arena_dirty_decay_ms_default_get() ssize_t oldval = (dirty ? arena_dirty_decay_ms_default_get()
: arena_muzzy_decay_ms_default_get()); : arena_muzzy_decay_ms_default_get());
READ(oldval, ssize_t); READ(oldval, ssize_t);
} }
if (newp != NULL) { if (newp != NULL) {