1*7bdf38e5Schristos #include "test/jemalloc_test.h" 2*7bdf38e5Schristos 3*7bdf38e5Schristos static size_t 4*7bdf38e5Schristos zero_reallocs() { 5*7bdf38e5Schristos if (!config_stats) { 6*7bdf38e5Schristos return 0; 7*7bdf38e5Schristos } 8*7bdf38e5Schristos size_t count = 12345; 9*7bdf38e5Schristos size_t sz = sizeof(count); 10*7bdf38e5Schristos 11*7bdf38e5Schristos expect_d_eq(mallctl("stats.zero_reallocs", (void *)&count, &sz, 12*7bdf38e5Schristos NULL, 0), 0, "Unexpected mallctl failure"); 13*7bdf38e5Schristos return count; 14*7bdf38e5Schristos } 15*7bdf38e5Schristos 16*7bdf38e5Schristos TEST_BEGIN(test_zero_reallocs) { 17*7bdf38e5Schristos test_skip_if(!config_stats); 18*7bdf38e5Schristos 19*7bdf38e5Schristos for (size_t i = 0; i < 100; ++i) { 20*7bdf38e5Schristos void *ptr = mallocx(i * i + 1, 0); 21*7bdf38e5Schristos expect_ptr_not_null(ptr, "Unexpected mallocx error"); 22*7bdf38e5Schristos size_t count = zero_reallocs(); 23*7bdf38e5Schristos expect_zu_eq(i, count, "Incorrect zero realloc count"); 24*7bdf38e5Schristos ptr = realloc(ptr, 0); 25*7bdf38e5Schristos expect_ptr_null(ptr, "Realloc didn't free"); 26*7bdf38e5Schristos count = zero_reallocs(); 27*7bdf38e5Schristos expect_zu_eq(i + 1, count, "Realloc didn't adjust count"); 28*7bdf38e5Schristos } 29*7bdf38e5Schristos } 30*7bdf38e5Schristos TEST_END 31*7bdf38e5Schristos 32*7bdf38e5Schristos int 33*7bdf38e5Schristos main(void) { 34*7bdf38e5Schristos /* 35*7bdf38e5Schristos * We expect explicit counts; reentrant tests run multiple times, so 36*7bdf38e5Schristos * counts leak across runs. 37*7bdf38e5Schristos */ 38*7bdf38e5Schristos return test_no_reentrancy( 39*7bdf38e5Schristos test_zero_reallocs); 40*7bdf38e5Schristos } 41