test/unit/bin: update bin_slab_reg_alloc call sites for new signature

All five call sites in test/unit/bin.c that called bin_slab_reg_alloc()
with the old two-argument signature are updated to pass tsdn and bin.
Three test functions (test_bin_slab_reg_alloc, test_bin_slabs_full,
test_bin_slabs_full_auto) lacked tsdn and bin_t entirely — they now
call tsdn_fetch() and bin_init() and wrap the allocation loops with
malloc_mutex_lock/unlock, matching the locking contract enforced by
the new malloc_mutex_assert_owner() in bin_slab_reg_alloc().

Verified: make check passes 17/17, 0 failures.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
LD-RW 2026-04-10 21:57:53 +03:00
parent 65a7d19928
commit 7c6a8f2203

View file

@ -54,12 +54,15 @@ TEST_END
* Test single-region allocation from a slab.
*/
TEST_BEGIN(test_bin_slab_reg_alloc) {
tsdn_t *tsdn = tsdn_fetch();
bin_t bin;
szind_t binind = 0;
const bin_info_t *bin_info = &bin_infos[binind];
edata_t slab;
unsigned nregs;
unsigned i;
bin_init(&bin);
create_mock_slab(&slab, binind, 0);
nregs = bin_info->nregs;
@ -68,7 +71,9 @@ TEST_BEGIN(test_bin_slab_reg_alloc) {
expect_u_gt(edata_nfree_get(&slab), 0,
"Slab should have free regions");
reg = bin_slab_reg_alloc(&slab, bin_info);
malloc_mutex_lock(tsdn, &bin.lock);
reg = bin_slab_reg_alloc(tsdn, &bin, &slab, bin_info);
malloc_mutex_unlock(tsdn, &bin.lock);
expect_ptr_not_null(reg,
"bin_slab_reg_alloc should return non-NULL");
/* Verify the pointer is within the slab. */
@ -198,6 +203,7 @@ TEST_END
* Test full slab list insert and remove (non-auto arena case).
*/
TEST_BEGIN(test_bin_slabs_full) {
tsdn_t *tsdn = tsdn_fetch();
bin_t bin;
szind_t binind = 0;
const bin_info_t *bin_info = &bin_infos[binind];
@ -208,9 +214,11 @@ TEST_BEGIN(test_bin_slabs_full) {
create_mock_slab(&slab, binind, 0);
/* Consume all regions so the slab appears full. */
malloc_mutex_lock(tsdn, &bin.lock);
for (i = 0; i < bin_info->nregs; i++) {
bin_slab_reg_alloc(&slab, bin_info);
bin_slab_reg_alloc(tsdn, &bin, &slab, bin_info);
}
malloc_mutex_unlock(tsdn, &bin.lock);
expect_u_eq(edata_nfree_get(&slab), 0, "Slab should be full");
/* Insert into full list (is_auto=false to actually track). */
@ -231,6 +239,7 @@ TEST_END
* Test that full slab insert/remove is a no-op for auto arenas.
*/
TEST_BEGIN(test_bin_slabs_full_auto) {
tsdn_t *tsdn = tsdn_fetch();
bin_t bin;
szind_t binind = 0;
const bin_info_t *bin_info = &bin_infos[binind];
@ -239,9 +248,11 @@ TEST_BEGIN(test_bin_slabs_full_auto) {
bin_init(&bin);
create_mock_slab(&slab, binind, 0);
malloc_mutex_lock(tsdn, &bin.lock);
for (i = 0; i < bin_info->nregs; i++) {
bin_slab_reg_alloc(&slab, bin_info);
bin_slab_reg_alloc(tsdn, &bin, &slab, bin_info);
}
malloc_mutex_unlock(tsdn, &bin.lock);
/* is_auto=true: insert should be a no-op. */
bin_slabs_full_insert(true, &bin, &slab);
@ -384,9 +395,11 @@ TEST_BEGIN(test_bin_refill_slabcur_full_to_list) {
create_mock_slab(&nonfull_slab, binind, 1);
/* Make full_slab actually full. */
malloc_mutex_lock(tsdn, &bin.lock);
for (i = 0; i < bin_info->nregs; i++) {
bin_slab_reg_alloc(&full_slab, bin_info);
bin_slab_reg_alloc(tsdn, &bin, &full_slab, bin_info);
}
malloc_mutex_unlock(tsdn, &bin.lock);
malloc_mutex_lock(tsdn, &bin.lock);
bin.slabcur = &full_slab;
@ -494,10 +507,12 @@ TEST_BEGIN(test_bin_dalloc_locked) {
nregs = bin_info->nregs;
ptrs = mallocx(nregs * sizeof(void *), 0);
assert_ptr_not_null(ptrs, "Unexpected mallocx failure");
malloc_mutex_lock(tsdn, &bin.lock);
for (i = 0; i < nregs; i++) {
ptrs[i] = bin_slab_reg_alloc(&slab, bin_info);
ptrs[i] = bin_slab_reg_alloc(tsdn, &bin, &slab, bin_info);
assert_ptr_not_null(ptrs[i], "Alloc should succeed");
}
malloc_mutex_unlock(tsdn, &bin.lock);
expect_u_eq(edata_nfree_get(&slab), 0, "Slab should be full");
/* Set this slab as slabcur so dalloc steps work correctly. */