Issue a warning upon directly accessing an arena's bins

An arena's bins should normally be accessed via the `arena_get_bin`
function, which properly takes into account bin-shards. To ensure that
we don't accidentally commit code which incorrectly accesses the bins
directly, we mark the field with `__attribute__((deprecated))` with an
appropriate warning message, and suppress the warning in the few places
where directly accessing the bins is allowed.
This commit is contained in:
Kevin Svetlitski 2023-08-04 11:43:59 -07:00 committed by Qi Wang
parent 120abd703a
commit 424dd61d57
2 changed files with 18 additions and 6 deletions

View File

@ -99,7 +99,9 @@ struct arena_s {
* The arena is allocated alongside its bins; really this is a
* dynamically sized array determined by the binshard settings.
*/
bin_t bins[0];
JEMALLOC_WARN_ON_USAGE("Do not use this field directly. "
"Use `arena_get_bin` instead.")
bin_t all_bins[0];
};
#endif /* JEMALLOC_INTERNAL_ARENA_STRUCTS_H */

View File

@ -1700,7 +1700,9 @@ arena_new(tsdn_t *tsdn, unsigned ind, const arena_config_t *config) {
/* Initialize bins. */
atomic_store_u(&arena->binshard_next, 0, ATOMIC_RELEASE);
for (i = 0; i < nbins_total; i++) {
bool err = bin_init(&arena->bins[i]);
JEMALLOC_SUPPRESS_WARN_ON_USAGE(
bool err = bin_init(&arena->all_bins[i]);
)
if (err) {
goto label_error;
}
@ -1849,7 +1851,9 @@ arena_boot(sc_data_t *sc_data, base_t *base, bool hpa) {
(1U << sc->lg_base) + (sc->ndelta << sc->lg_delta));
}
uint32_t cur_offset = (uint32_t)offsetof(arena_t, bins);
JEMALLOC_SUPPRESS_WARN_ON_USAGE(
uint32_t cur_offset = (uint32_t)offsetof(arena_t, all_bins);
)
for (szind_t i = 0; i < SC_NBINS; i++) {
arena_bin_offsets[i] = cur_offset;
nbins_total += bin_infos[i].n_shards;
@ -1904,14 +1908,18 @@ arena_prefork7(tsdn_t *tsdn, arena_t *arena) {
void
arena_prefork8(tsdn_t *tsdn, arena_t *arena) {
for (unsigned i = 0; i < nbins_total; i++) {
bin_prefork(tsdn, &arena->bins[i]);
JEMALLOC_SUPPRESS_WARN_ON_USAGE(
bin_prefork(tsdn, &arena->all_bins[i]);
)
}
}
void
arena_postfork_parent(tsdn_t *tsdn, arena_t *arena) {
for (unsigned i = 0; i < nbins_total; i++) {
bin_postfork_parent(tsdn, &arena->bins[i]);
JEMALLOC_SUPPRESS_WARN_ON_USAGE(
bin_postfork_parent(tsdn, &arena->all_bins[i]);
)
}
malloc_mutex_postfork_parent(tsdn, &arena->large_mtx);
@ -1949,7 +1957,9 @@ arena_postfork_child(tsdn_t *tsdn, arena_t *arena) {
}
for (unsigned i = 0; i < nbins_total; i++) {
bin_postfork_child(tsdn, &arena->bins[i]);
JEMALLOC_SUPPRESS_WARN_ON_USAGE(
bin_postfork_child(tsdn, &arena->all_bins[i]);
)
}
malloc_mutex_postfork_child(tsdn, &arena->large_mtx);