diff options
author | Jason Evans <jasone@canonware.com> | 2016-04-22 14:37:17 -0700 |
---|---|---|
committer | Jason Evans <jasone@canonware.com> | 2016-04-22 15:20:06 -0700 |
commit | 19ff2cefba48d1ddab8fb52e3d78f309ca2553cf (patch) | |
tree | 25c4cba5d31e58642058e15bbfd8cc834594d150 /test | |
parent | 66cd953514a18477eb49732e40d5c2ab5f1b12c5 (diff) | |
download | jemalloc-19ff2cefba48d1ddab8fb52e3d78f309ca2553cf.tar.gz |
Implement the arena.<i>.reset mallctl.
This makes it possible to discard all of an arena's allocations in a
single operation.
This resolves #146.
Diffstat (limited to 'test')
-rw-r--r-- | test/unit/arena_reset.c | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/test/unit/arena_reset.c b/test/unit/arena_reset.c new file mode 100644 index 0000000..52170cc --- /dev/null +++ b/test/unit/arena_reset.c @@ -0,0 +1,160 @@ +#include "test/jemalloc_test.h" + +#ifdef JEMALLOC_PROF +const char *malloc_conf = "prof:true,lg_prof_sample:0"; +#endif + +static unsigned +get_nsizes_impl(const char *cmd) +{ + unsigned ret; + size_t z; + + z = sizeof(unsigned); + assert_d_eq(mallctl(cmd, &ret, &z, NULL, 0), 0, + "Unexpected mallctl(\"%s\", ...) failure", cmd); + + return (ret); +} + +static unsigned +get_nsmall(void) +{ + + return (get_nsizes_impl("arenas.nbins")); +} + +static unsigned +get_nlarge(void) +{ + + return (get_nsizes_impl("arenas.nlruns")); +} + +static unsigned +get_nhuge(void) +{ + + return (get_nsizes_impl("arenas.nhchunks")); +} + +static size_t +get_size_impl(const char *cmd, size_t ind) +{ + size_t ret; + size_t z; + size_t mib[4]; + size_t miblen = 4; + + z = sizeof(size_t); + assert_d_eq(mallctlnametomib(cmd, mib, &miblen), + 0, "Unexpected mallctlnametomib(\"%s\", ...) failure", cmd); + mib[2] = ind; + z = sizeof(size_t); + assert_d_eq(mallctlbymib(mib, miblen, &ret, &z, NULL, 0), + 0, "Unexpected mallctlbymib([\"%s\", %zu], ...) failure", cmd, ind); + + return (ret); +} + +static size_t +get_small_size(size_t ind) +{ + + return (get_size_impl("arenas.bin.0.size", ind)); +} + +static size_t +get_large_size(size_t ind) +{ + + return (get_size_impl("arenas.lrun.0.size", ind)); +} + +static size_t +get_huge_size(size_t ind) +{ + + return (get_size_impl("arenas.hchunk.0.size", ind)); +} + +TEST_BEGIN(test_arena_reset) +{ +#define NHUGE 4 + unsigned arena_ind, nsmall, nlarge, nhuge, nptrs, i; + size_t sz, miblen; + void **ptrs; + size_t mib[3]; + tsd_t *tsd; + + test_skip_if((config_valgrind && unlikely(in_valgrind)) || (config_fill + && unlikely(opt_quarantine))); + + sz = sizeof(unsigned); + assert_d_eq(mallctl("arenas.extend", &arena_ind, &sz, NULL, 0), 0, + "Unexpected mallctl() failure"); + + nsmall = get_nsmall(); + nlarge = get_nlarge(); + nhuge = get_nhuge() > NHUGE ? NHUGE : get_nhuge(); + nptrs = nsmall + nlarge + nhuge; + ptrs = (void **)malloc(nptrs * sizeof(void *)); + assert_ptr_not_null(ptrs, "Unexpected malloc() failure"); + + /* Allocate objects with a wide range of sizes. */ + for (i = 0; i < nsmall; i++) { + sz = get_small_size(i); + ptrs[i] = mallocx(sz, MALLOCX_ARENA(arena_ind)); + assert_ptr_not_null(ptrs[i], + "Unexpected mallocx(%zu, MALLOCX_ARENA(%u)) failure", sz, + arena_ind); + } + for (i = 0; i < nlarge; i++) { + sz = get_large_size(i); + ptrs[nsmall + i] = mallocx(sz, MALLOCX_ARENA(arena_ind)); + assert_ptr_not_null(ptrs[i], + "Unexpected mallocx(%zu, MALLOCX_ARENA(%u)) failure", sz, + arena_ind); + } + for (i = 0; i < nhuge; i++) { + sz = get_huge_size(i); + ptrs[nsmall + nlarge + i] = mallocx(sz, + MALLOCX_ARENA(arena_ind)); + assert_ptr_not_null(ptrs[i], + "Unexpected mallocx(%zu, MALLOCX_ARENA(%u)) failure", sz, + arena_ind); + } + + tsd = tsd_fetch(); + + /* Verify allocations. */ + for (i = 0; i < nptrs; i++) { + assert_zu_gt(ivsalloc(tsd, ptrs[i], false), 0, + "Allocation should have queryable size"); + } + + /* Reset. */ + miblen = sizeof(mib)/sizeof(size_t); + assert_d_eq(mallctlnametomib("arena.0.reset", mib, &miblen), 0, + "Unexpected mallctlnametomib() failure"); + mib[1] = (size_t)arena_ind; + assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0, + "Unexpected mallctlbymib() failure"); + + /* Verify allocations no longer exist. */ + for (i = 0; i < nptrs; i++) { + assert_zu_eq(ivsalloc(tsd, ptrs[i], false), 0, + "Allocation should no longer exist"); + } + + free(ptrs); +} +TEST_END + +int +main(void) +{ + + return (test( + test_arena_reset)); +} |