| #include "test/jemalloc_test.h" |
| |
| static size_t |
| zero_reallocs() { |
| if (!config_stats) { |
| return 0; |
| } |
| size_t count = 12345; |
| size_t sz = sizeof(count); |
| |
| expect_d_eq(mallctl("stats.zero_reallocs", (void *)&count, &sz, |
| NULL, 0), 0, "Unexpected mallctl failure"); |
| return count; |
| } |
| |
| TEST_BEGIN(test_zero_reallocs) { |
| test_skip_if(!config_stats); |
| |
| for (size_t i = 0; i < 100; ++i) { |
| void *ptr = mallocx(i * i + 1, 0); |
| expect_ptr_not_null(ptr, "Unexpected mallocx error"); |
| size_t count = zero_reallocs(); |
| expect_zu_eq(i, count, "Incorrect zero realloc count"); |
| ptr = realloc(ptr, 0); |
| expect_ptr_null(ptr, "Realloc didn't free"); |
| count = zero_reallocs(); |
| expect_zu_eq(i + 1, count, "Realloc didn't adjust count"); |
| } |
| } |
| TEST_END |
| |
| int |
| main(void) { |
| /* |
| * We expect explicit counts; reentrant tests run multiple times, so |
| * counts leak across runs. |
| */ |
| return test_no_reentrancy( |
| test_zero_reallocs); |
| } |