Use separate arena for chunk tests.
This assures that side effects of internal allocation don't impact tests.
This commit is contained in:
parent
c3b008ec39
commit
de35328a10
@ -121,6 +121,10 @@ TEST_BEGIN(test_chunk)
|
|||||||
{
|
{
|
||||||
void *p;
|
void *p;
|
||||||
size_t old_size, new_size, large0, large1, huge0, huge1, huge2, sz;
|
size_t old_size, new_size, large0, large1, huge0, huge1, huge2, sz;
|
||||||
|
unsigned arena_ind;
|
||||||
|
int flags;
|
||||||
|
size_t hooks_mib[3], purge_mib[3];
|
||||||
|
size_t hooks_miblen, purge_miblen;
|
||||||
chunk_hooks_t new_hooks = {
|
chunk_hooks_t new_hooks = {
|
||||||
chunk_alloc,
|
chunk_alloc,
|
||||||
chunk_dalloc,
|
chunk_dalloc,
|
||||||
@ -132,10 +136,19 @@ TEST_BEGIN(test_chunk)
|
|||||||
};
|
};
|
||||||
bool xallocx_success_a, xallocx_success_b, xallocx_success_c;
|
bool xallocx_success_a, xallocx_success_b, xallocx_success_c;
|
||||||
|
|
||||||
|
sz = sizeof(unsigned);
|
||||||
|
assert_d_eq(mallctl("arenas.extend", &arena_ind, &sz, NULL, 0), 0,
|
||||||
|
"Unexpected mallctl() failure");
|
||||||
|
flags = MALLOCX_ARENA(arena_ind) | MALLOCX_TCACHE_NONE;
|
||||||
|
|
||||||
/* Install custom chunk hooks. */
|
/* Install custom chunk hooks. */
|
||||||
|
hooks_miblen = sizeof(hooks_mib)/sizeof(size_t);
|
||||||
|
assert_d_eq(mallctlnametomib("arena.0.chunk_hooks", hooks_mib,
|
||||||
|
&hooks_miblen), 0, "Unexpected mallctlnametomib() failure");
|
||||||
|
hooks_mib[1] = (size_t)arena_ind;
|
||||||
old_size = sizeof(chunk_hooks_t);
|
old_size = sizeof(chunk_hooks_t);
|
||||||
new_size = sizeof(chunk_hooks_t);
|
new_size = sizeof(chunk_hooks_t);
|
||||||
assert_d_eq(mallctl("arena.0.chunk_hooks", &old_hooks, &old_size,
|
assert_d_eq(mallctlbymib(hooks_mib, hooks_miblen, &old_hooks, &old_size,
|
||||||
&new_hooks, new_size), 0, "Unexpected chunk_hooks error");
|
&new_hooks, new_size), 0, "Unexpected chunk_hooks error");
|
||||||
orig_hooks = old_hooks;
|
orig_hooks = old_hooks;
|
||||||
assert_ptr_ne(old_hooks.alloc, chunk_alloc, "Unexpected alloc error");
|
assert_ptr_ne(old_hooks.alloc, chunk_alloc, "Unexpected alloc error");
|
||||||
@ -165,45 +178,49 @@ TEST_BEGIN(test_chunk)
|
|||||||
"Unexpected arenas.hchunk.2.size failure");
|
"Unexpected arenas.hchunk.2.size failure");
|
||||||
|
|
||||||
/* Test dalloc/decommit/purge cascade. */
|
/* Test dalloc/decommit/purge cascade. */
|
||||||
|
purge_miblen = sizeof(purge_mib)/sizeof(size_t);
|
||||||
|
assert_d_eq(mallctlnametomib("arena.0.purge", purge_mib, &purge_miblen),
|
||||||
|
0, "Unexpected mallctlnametomib() failure");
|
||||||
|
purge_mib[1] = (size_t)arena_ind;
|
||||||
do_dalloc = false;
|
do_dalloc = false;
|
||||||
do_decommit = false;
|
do_decommit = false;
|
||||||
p = mallocx(huge0 * 2, 0);
|
p = mallocx(huge0 * 2, flags);
|
||||||
assert_ptr_not_null(p, "Unexpected mallocx() error");
|
assert_ptr_not_null(p, "Unexpected mallocx() error");
|
||||||
did_dalloc = false;
|
did_dalloc = false;
|
||||||
did_decommit = false;
|
did_decommit = false;
|
||||||
did_purge = false;
|
did_purge = false;
|
||||||
did_split = false;
|
did_split = false;
|
||||||
xallocx_success_a = (xallocx(p, huge0, 0, 0) == huge0);
|
xallocx_success_a = (xallocx(p, huge0, 0, flags) == huge0);
|
||||||
assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
|
assert_d_eq(mallctlbymib(purge_mib, purge_miblen, NULL, NULL, NULL, 0),
|
||||||
"Unexpected arena.0.purge error");
|
0, "Unexpected arena.%u.purge error", arena_ind);
|
||||||
if (xallocx_success_a) {
|
if (xallocx_success_a) {
|
||||||
assert_true(did_dalloc, "Expected dalloc");
|
assert_true(did_dalloc, "Expected dalloc");
|
||||||
assert_false(did_decommit, "Unexpected decommit");
|
assert_false(did_decommit, "Unexpected decommit");
|
||||||
assert_true(did_purge, "Expected purge");
|
assert_true(did_purge, "Expected purge");
|
||||||
}
|
}
|
||||||
assert_true(did_split, "Expected split");
|
assert_true(did_split, "Expected split");
|
||||||
dallocx(p, 0);
|
dallocx(p, flags);
|
||||||
do_dalloc = true;
|
do_dalloc = true;
|
||||||
|
|
||||||
/* Test decommit/commit and observe split/merge. */
|
/* Test decommit/commit and observe split/merge. */
|
||||||
do_dalloc = false;
|
do_dalloc = false;
|
||||||
do_decommit = true;
|
do_decommit = true;
|
||||||
p = mallocx(huge0 * 2, 0);
|
p = mallocx(huge0 * 2, flags);
|
||||||
assert_ptr_not_null(p, "Unexpected mallocx() error");
|
assert_ptr_not_null(p, "Unexpected mallocx() error");
|
||||||
did_decommit = false;
|
did_decommit = false;
|
||||||
did_commit = false;
|
did_commit = false;
|
||||||
did_split = false;
|
did_split = false;
|
||||||
did_merge = false;
|
did_merge = false;
|
||||||
xallocx_success_b = (xallocx(p, huge0, 0, 0) == huge0);
|
xallocx_success_b = (xallocx(p, huge0, 0, flags) == huge0);
|
||||||
assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
|
assert_d_eq(mallctlbymib(purge_mib, purge_miblen, NULL, NULL, NULL, 0),
|
||||||
"Unexpected arena.0.purge error");
|
0, "Unexpected arena.%u.purge error", arena_ind);
|
||||||
if (xallocx_success_b)
|
if (xallocx_success_b)
|
||||||
assert_true(did_split, "Expected split");
|
assert_true(did_split, "Expected split");
|
||||||
xallocx_success_c = (xallocx(p, huge0 * 2, 0, 0) == huge0 * 2);
|
xallocx_success_c = (xallocx(p, huge0 * 2, 0, flags) == huge0 * 2);
|
||||||
assert_b_eq(did_decommit, did_commit, "Expected decommit/commit match");
|
assert_b_eq(did_decommit, did_commit, "Expected decommit/commit match");
|
||||||
if (xallocx_success_b && xallocx_success_c)
|
if (xallocx_success_b && xallocx_success_c)
|
||||||
assert_true(did_merge, "Expected merge");
|
assert_true(did_merge, "Expected merge");
|
||||||
dallocx(p, 0);
|
dallocx(p, flags);
|
||||||
do_dalloc = true;
|
do_dalloc = true;
|
||||||
do_decommit = false;
|
do_decommit = false;
|
||||||
|
|
||||||
@ -214,42 +231,42 @@ TEST_BEGIN(test_chunk)
|
|||||||
* successful xallocx() from size=huge2 to size=huge1 is
|
* successful xallocx() from size=huge2 to size=huge1 is
|
||||||
* guaranteed to leave trailing purgeable memory.
|
* guaranteed to leave trailing purgeable memory.
|
||||||
*/
|
*/
|
||||||
p = mallocx(huge2, 0);
|
p = mallocx(huge2, flags);
|
||||||
assert_ptr_not_null(p, "Unexpected mallocx() error");
|
assert_ptr_not_null(p, "Unexpected mallocx() error");
|
||||||
did_purge = false;
|
did_purge = false;
|
||||||
assert_zu_eq(xallocx(p, huge1, 0, 0), huge1,
|
assert_zu_eq(xallocx(p, huge1, 0, flags), huge1,
|
||||||
"Unexpected xallocx() failure");
|
"Unexpected xallocx() failure");
|
||||||
assert_true(did_purge, "Expected purge");
|
assert_true(did_purge, "Expected purge");
|
||||||
dallocx(p, 0);
|
dallocx(p, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Test decommit for large allocations. */
|
/* Test decommit for large allocations. */
|
||||||
do_decommit = true;
|
do_decommit = true;
|
||||||
p = mallocx(large1, 0);
|
p = mallocx(large1, flags);
|
||||||
assert_ptr_not_null(p, "Unexpected mallocx() error");
|
assert_ptr_not_null(p, "Unexpected mallocx() error");
|
||||||
assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
|
assert_d_eq(mallctlbymib(purge_mib, purge_miblen, NULL, NULL, NULL, 0),
|
||||||
"Unexpected arena.0.purge error");
|
0, "Unexpected arena.%u.purge error", arena_ind);
|
||||||
did_decommit = false;
|
did_decommit = false;
|
||||||
assert_zu_eq(xallocx(p, large0, 0, 0), large0,
|
assert_zu_eq(xallocx(p, large0, 0, flags), large0,
|
||||||
"Unexpected xallocx() failure");
|
"Unexpected xallocx() failure");
|
||||||
assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
|
assert_d_eq(mallctlbymib(purge_mib, purge_miblen, NULL, NULL, NULL, 0),
|
||||||
"Unexpected arena.0.purge error");
|
0, "Unexpected arena.%u.purge error", arena_ind);
|
||||||
did_commit = false;
|
did_commit = false;
|
||||||
assert_zu_eq(xallocx(p, large1, 0, 0), large1,
|
assert_zu_eq(xallocx(p, large1, 0, flags), large1,
|
||||||
"Unexpected xallocx() failure");
|
"Unexpected xallocx() failure");
|
||||||
assert_b_eq(did_decommit, did_commit, "Expected decommit/commit match");
|
assert_b_eq(did_decommit, did_commit, "Expected decommit/commit match");
|
||||||
dallocx(p, 0);
|
dallocx(p, flags);
|
||||||
do_decommit = false;
|
do_decommit = false;
|
||||||
|
|
||||||
/* Make sure non-huge allocation succeeds. */
|
/* Make sure non-huge allocation succeeds. */
|
||||||
p = mallocx(42, 0);
|
p = mallocx(42, flags);
|
||||||
assert_ptr_not_null(p, "Unexpected mallocx() error");
|
assert_ptr_not_null(p, "Unexpected mallocx() error");
|
||||||
dallocx(p, 0);
|
dallocx(p, flags);
|
||||||
|
|
||||||
/* Restore chunk hooks. */
|
/* Restore chunk hooks. */
|
||||||
assert_d_eq(mallctl("arena.0.chunk_hooks", NULL, NULL, &old_hooks,
|
assert_d_eq(mallctlbymib(hooks_mib, hooks_miblen, NULL, NULL,
|
||||||
new_size), 0, "Unexpected chunk_hooks error");
|
&old_hooks, new_size), 0, "Unexpected chunk_hooks error");
|
||||||
assert_d_eq(mallctl("arena.0.chunk_hooks", &old_hooks, &old_size,
|
assert_d_eq(mallctlbymib(hooks_mib, hooks_miblen, &old_hooks, &old_size,
|
||||||
NULL, 0), 0, "Unexpected chunk_hooks error");
|
NULL, 0), 0, "Unexpected chunk_hooks error");
|
||||||
assert_ptr_eq(old_hooks.alloc, orig_hooks.alloc,
|
assert_ptr_eq(old_hooks.alloc, orig_hooks.alloc,
|
||||||
"Unexpected alloc error");
|
"Unexpected alloc error");
|
||||||
|
Loading…
Reference in New Issue
Block a user