b55419f9b9
Develop new data structure and code logic for holding profiling related information stored in the extent that may be needed after the extent is released, which in particular is the case for the reallocation code path (e.g. in `rallocx()` and `xallocx()`). The data structure is a generalization of `prof_tctx_t`: we previously only copy out the `prof_tctx` before the extent is released, but we may be in need of additional fields. Currently the only additional field is the allocation time field, but there may be more fields in the future. The restructuring also resolved a bug: `prof_realloc()` mistakenly passed the new `ptr` to `prof_free_sampled_object()`, but passing in the `old_ptr` would crash because it's already been released. Now the essential profiling information is collectively copied out early and safely passed to `prof_free_sampled_object()` after the extent is released.
47 lines
1.3 KiB
C
47 lines
1.3 KiB
C
#include "test/jemalloc_test.h"
|
|
|
|
TEST_BEGIN(test_prof_realloc) {
|
|
tsdn_t *tsdn;
|
|
int flags;
|
|
void *p, *q;
|
|
prof_info_t prof_info_p, prof_info_q;
|
|
uint64_t curobjs_0, curobjs_1, curobjs_2, curobjs_3;
|
|
|
|
test_skip_if(!config_prof);
|
|
|
|
tsdn = tsdn_fetch();
|
|
flags = MALLOCX_TCACHE_NONE;
|
|
|
|
prof_cnt_all(&curobjs_0, NULL, NULL, NULL);
|
|
p = mallocx(1024, flags);
|
|
assert_ptr_not_null(p, "Unexpected mallocx() failure");
|
|
prof_info_get(tsdn, p, NULL, &prof_info_p);
|
|
assert_ptr_ne(prof_info_p.prof_tctx, (prof_tctx_t *)(uintptr_t)1U,
|
|
"Expected valid tctx");
|
|
prof_cnt_all(&curobjs_1, NULL, NULL, NULL);
|
|
assert_u64_eq(curobjs_0 + 1, curobjs_1,
|
|
"Allocation should have increased sample size");
|
|
|
|
q = rallocx(p, 2048, flags);
|
|
assert_ptr_ne(p, q, "Expected move");
|
|
assert_ptr_not_null(p, "Unexpected rmallocx() failure");
|
|
prof_info_get(tsdn, q, NULL, &prof_info_q);
|
|
assert_ptr_ne(prof_info_q.prof_tctx, (prof_tctx_t *)(uintptr_t)1U,
|
|
"Expected valid tctx");
|
|
prof_cnt_all(&curobjs_2, NULL, NULL, NULL);
|
|
assert_u64_eq(curobjs_1, curobjs_2,
|
|
"Reallocation should not have changed sample size");
|
|
|
|
dallocx(q, flags);
|
|
prof_cnt_all(&curobjs_3, NULL, NULL, NULL);
|
|
assert_u64_eq(curobjs_0, curobjs_3,
|
|
"Sample size should have returned to base level");
|
|
}
|
|
TEST_END
|
|
|
|
int
|
|
main(void) {
|
|
return test_no_reentrancy(
|
|
test_prof_realloc);
|
|
}
|