From e286fba00a8e4cd71033e583f88ae35cbd914778 Mon Sep 17 00:00:00 2001 From: Slobodan Predolac Date: Thu, 30 Apr 2026 15:31:21 -0700 Subject: [PATCH] Extract bin->stats.nrequests mutation into bin_stats_nrequests_add --- include/jemalloc/internal/bin.h | 7 +++++++ src/tcache.c | 5 ++--- test/unit/bin.c | 37 +++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/include/jemalloc/internal/bin.h b/include/jemalloc/internal/bin.h index 51d4c89e..a7eba760 100644 --- a/include/jemalloc/internal/bin.h +++ b/include/jemalloc/internal/bin.h @@ -100,6 +100,13 @@ bin_t *bin_choose(tsdn_t *tsdn, arena_t *arena, szind_t binind, unsigned *binshard_p); /* Stats. */ +static inline void +bin_stats_nrequests_add(tsdn_t *tsdn, bin_t *bin, uint64_t n) { + malloc_mutex_lock(tsdn, &bin->lock); + bin->stats.nrequests += n; + malloc_mutex_unlock(tsdn, &bin->lock); +} + static inline void bin_stats_merge(tsdn_t *tsdn, bin_stats_data_t *dst_bin_stats, bin_t *bin) { malloc_mutex_lock(tsdn, &bin->lock); diff --git a/src/tcache.c b/src/tcache.c index fe210d27..d1a2cfd0 100644 --- a/src/tcache.c +++ b/src/tcache.c @@ -1287,9 +1287,8 @@ tcache_stats_merge(tsdn_t *tsdn, tcache_t *tcache, arena_t *arena) { } if (i < SC_NBINS) { bin_t *bin = bin_choose(tsdn, arena, i, NULL); - malloc_mutex_lock(tsdn, &bin->lock); - bin->stats.nrequests += cache_bin->tstats.nrequests; - malloc_mutex_unlock(tsdn, &bin->lock); + bin_stats_nrequests_add(tsdn, bin, + cache_bin->tstats.nrequests); } else { arena_stats_large_flush_nrequests_add(tsdn, &arena->stats, i, cache_bin->tstats.nrequests); diff --git a/test/unit/bin.c b/test/unit/bin.c index 002bbf11..17365d02 100644 --- a/test/unit/bin.c +++ b/test/unit/bin.c @@ -647,6 +647,42 @@ TEST_BEGIN(test_bin_dalloc_slab_prepare) { } TEST_END +/* + * Test that bin_stats_nrequests_add accumulates under the bin lock. + */ +TEST_BEGIN(test_bin_stats_nrequests_add) { + tsdn_t *tsdn = tsdn_fetch(); + bin_t bin; + + bin_init(&bin); + if (config_stats) { + expect_u64_eq(bin.stats.nrequests, 0, + "Fresh bin should have zero nrequests"); + } + + /* Single add. */ + bin_stats_nrequests_add(tsdn, &bin, 7); + if (config_stats) { + expect_u64_eq(bin.stats.nrequests, 7, + "nrequests should equal the added value"); + } + + /* Adds accumulate. */ + bin_stats_nrequests_add(tsdn, &bin, 3); + if (config_stats) { + expect_u64_eq(bin.stats.nrequests, 10, + "nrequests should accumulate across calls"); + } + + /* Adding zero is a no-op. */ + bin_stats_nrequests_add(tsdn, &bin, 0); + if (config_stats) { + expect_u64_eq(bin.stats.nrequests, 10, + "Adding zero should not change nrequests"); + } +} +TEST_END + /* * Test bin_shard_sizes_boot and bin_update_shard_size. */ @@ -819,6 +855,7 @@ main(void) { test_bin_lower_slab_replaces_slabcur, test_bin_lower_slab_inserts_nonfull, test_bin_dalloc_slab_prepare, + test_bin_stats_nrequests_add, test_bin_shard_sizes, test_bin_alloc_free_cycle, test_bin_multi_size_class);