119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans#include "test/jemalloc_test.h" 219ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans#ifdef JEMALLOC_PROF 419ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansconst char *malloc_conf = "prof:true,lg_prof_sample:0"; 519ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans#endif 619ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 719ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansstatic unsigned 819ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansget_nsizes_impl(const char *cmd) 919ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans{ 1019ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans unsigned ret; 1119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans size_t z; 1219ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 1319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans z = sizeof(unsigned); 148f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl(cmd, (void *)&ret, &z, NULL, 0), 0, 1519ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans "Unexpected mallctl(\"%s\", ...) failure", cmd); 1619ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 1719ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans return (ret); 1819ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans} 1919ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 2019ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansstatic unsigned 2119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansget_nsmall(void) 2219ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans{ 2319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 2419ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans return (get_nsizes_impl("arenas.nbins")); 2519ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans} 2619ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 2719ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansstatic unsigned 2819ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansget_nlarge(void) 2919ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans{ 3019ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 3119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans return (get_nsizes_impl("arenas.nlruns")); 3219ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans} 3319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 3419ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansstatic unsigned 3519ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansget_nhuge(void) 3619ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans{ 3719ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 3819ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans return (get_nsizes_impl("arenas.nhchunks")); 3919ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans} 4019ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 4119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansstatic size_t 4219ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansget_size_impl(const char *cmd, size_t ind) 4319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans{ 4419ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans size_t ret; 4519ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans size_t z; 4619ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans size_t mib[4]; 4719ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans size_t miblen = 4; 4819ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 4919ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans z = sizeof(size_t); 5019ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans assert_d_eq(mallctlnametomib(cmd, mib, &miblen), 5119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 0, "Unexpected mallctlnametomib(\"%s\", ...) failure", cmd); 5219ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans mib[2] = ind; 5319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans z = sizeof(size_t); 548f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctlbymib(mib, miblen, (void *)&ret, &z, NULL, 0), 5519ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 0, "Unexpected mallctlbymib([\"%s\", %zu], ...) failure", cmd, ind); 5619ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 5719ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans return (ret); 5819ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans} 5919ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 6019ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansstatic size_t 6119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansget_small_size(size_t ind) 6219ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans{ 6319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 6419ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans return (get_size_impl("arenas.bin.0.size", ind)); 6519ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans} 6619ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 6719ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansstatic size_t 6819ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansget_large_size(size_t ind) 6919ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans{ 7019ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 7119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans return (get_size_impl("arenas.lrun.0.size", ind)); 7219ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans} 7319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 7419ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansstatic size_t 7519ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansget_huge_size(size_t ind) 7619ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans{ 7719ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 7819ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans return (get_size_impl("arenas.hchunk.0.size", ind)); 7919ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans} 8019ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 8119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason EvansTEST_BEGIN(test_arena_reset) 8219ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans{ 8319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans#define NHUGE 4 8419ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans unsigned arena_ind, nsmall, nlarge, nhuge, nptrs, i; 8519ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans size_t sz, miblen; 8619ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans void **ptrs; 872fe64d237cf65baa9f6056622e896949933355e5Jason Evans int flags; 8819ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans size_t mib[3]; 89c1e00ef2a6442d1d047950247c757821560db329Jason Evans tsdn_t *tsdn; 9019ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 9119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans test_skip_if((config_valgrind && unlikely(in_valgrind)) || (config_fill 9219ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans && unlikely(opt_quarantine))); 9319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 9419ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans sz = sizeof(unsigned); 958f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans assert_d_eq(mallctl("arenas.extend", (void *)&arena_ind, &sz, NULL, 0), 968f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans 0, "Unexpected mallctl() failure"); 9719ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 982fe64d237cf65baa9f6056622e896949933355e5Jason Evans flags = MALLOCX_ARENA(arena_ind) | MALLOCX_TCACHE_NONE; 992fe64d237cf65baa9f6056622e896949933355e5Jason Evans 10019ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans nsmall = get_nsmall(); 10119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans nlarge = get_nlarge(); 10219ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans nhuge = get_nhuge() > NHUGE ? NHUGE : get_nhuge(); 10319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans nptrs = nsmall + nlarge + nhuge; 10419ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans ptrs = (void **)malloc(nptrs * sizeof(void *)); 10519ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans assert_ptr_not_null(ptrs, "Unexpected malloc() failure"); 10619ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 10719ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans /* Allocate objects with a wide range of sizes. */ 10819ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans for (i = 0; i < nsmall; i++) { 10919ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans sz = get_small_size(i); 1102fe64d237cf65baa9f6056622e896949933355e5Jason Evans ptrs[i] = mallocx(sz, flags); 11119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans assert_ptr_not_null(ptrs[i], 1122fe64d237cf65baa9f6056622e896949933355e5Jason Evans "Unexpected mallocx(%zu, %#x) failure", sz, flags); 11319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans } 11419ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans for (i = 0; i < nlarge; i++) { 11519ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans sz = get_large_size(i); 1162fe64d237cf65baa9f6056622e896949933355e5Jason Evans ptrs[nsmall + i] = mallocx(sz, flags); 11719ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans assert_ptr_not_null(ptrs[i], 1182fe64d237cf65baa9f6056622e896949933355e5Jason Evans "Unexpected mallocx(%zu, %#x) failure", sz, flags); 11919ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans } 12019ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans for (i = 0; i < nhuge; i++) { 12119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans sz = get_huge_size(i); 1222fe64d237cf65baa9f6056622e896949933355e5Jason Evans ptrs[nsmall + nlarge + i] = mallocx(sz, flags); 12319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans assert_ptr_not_null(ptrs[i], 1242fe64d237cf65baa9f6056622e896949933355e5Jason Evans "Unexpected mallocx(%zu, %#x) failure", sz, flags); 12519ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans } 12619ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 127c1e00ef2a6442d1d047950247c757821560db329Jason Evans tsdn = tsdn_fetch(); 12819ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 12919ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans /* Verify allocations. */ 13019ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans for (i = 0; i < nptrs; i++) { 131c1e00ef2a6442d1d047950247c757821560db329Jason Evans assert_zu_gt(ivsalloc(tsdn, ptrs[i], false), 0, 13219ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans "Allocation should have queryable size"); 13319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans } 13419ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 13519ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans /* Reset. */ 13619ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans miblen = sizeof(mib)/sizeof(size_t); 13719ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans assert_d_eq(mallctlnametomib("arena.0.reset", mib, &miblen), 0, 13819ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans "Unexpected mallctlnametomib() failure"); 13919ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans mib[1] = (size_t)arena_ind; 14019ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0, 14119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans "Unexpected mallctlbymib() failure"); 14219ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 14319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans /* Verify allocations no longer exist. */ 14419ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans for (i = 0; i < nptrs; i++) { 145c1e00ef2a6442d1d047950247c757821560db329Jason Evans assert_zu_eq(ivsalloc(tsdn, ptrs[i], false), 0, 14619ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans "Allocation should no longer exist"); 14719ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans } 14819ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 14919ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans free(ptrs); 15019ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans} 15119ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason EvansTEST_END 15219ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 15319ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansint 15419ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evansmain(void) 15519ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans{ 15619ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans 15719ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans return (test( 15819ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans test_arena_reset)); 15919ff2cefba48d1ddab8fb52e3d78f309ca2553cfJason Evans} 160