xref: /netbsd-src/external/bsd/jemalloc/dist/test/unit/zero_reallocs.c (revision 7bdf38e5b7a28439665f2fdeff81e36913eef7dd)
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