Home | History | Annotate | Download | only in unit
      1 #include "test/jemalloc_test.h"
      2 
      3 #ifdef JEMALLOC_PROF
      4 const char *malloc_conf = "prof:true,lg_prof_sample:0";
      5 #endif
      6 
      7 static unsigned
      8 get_nsizes_impl(const char *cmd)
      9 {
     10 	unsigned ret;
     11 	size_t z;
     12 
     13 	z = sizeof(unsigned);
     14 	assert_d_eq(mallctl(cmd, (void *)&ret, &z, NULL, 0), 0,
     15 	    "Unexpected mallctl(\"%s\", ...) failure", cmd);
     16 
     17 	return (ret);
     18 }
     19 
     20 static unsigned
     21 get_nsmall(void)
     22 {
     23 
     24 	return (get_nsizes_impl("arenas.nbins"));
     25 }
     26 
     27 static unsigned
     28 get_nlarge(void)
     29 {
     30 
     31 	return (get_nsizes_impl("arenas.nlruns"));
     32 }
     33 
     34 static unsigned
     35 get_nhuge(void)
     36 {
     37 
     38 	return (get_nsizes_impl("arenas.nhchunks"));
     39 }
     40 
     41 static size_t
     42 get_size_impl(const char *cmd, size_t ind)
     43 {
     44 	size_t ret;
     45 	size_t z;
     46 	size_t mib[4];
     47 	size_t miblen = 4;
     48 
     49 	z = sizeof(size_t);
     50 	assert_d_eq(mallctlnametomib(cmd, mib, &miblen),
     51 	    0, "Unexpected mallctlnametomib(\"%s\", ...) failure", cmd);
     52 	mib[2] = ind;
     53 	z = sizeof(size_t);
     54 	assert_d_eq(mallctlbymib(mib, miblen, (void *)&ret, &z, NULL, 0),
     55 	    0, "Unexpected mallctlbymib([\"%s\", %zu], ...) failure", cmd, ind);
     56 
     57 	return (ret);
     58 }
     59 
     60 static size_t
     61 get_small_size(size_t ind)
     62 {
     63 
     64 	return (get_size_impl("arenas.bin.0.size", ind));
     65 }
     66 
     67 static size_t
     68 get_large_size(size_t ind)
     69 {
     70 
     71 	return (get_size_impl("arenas.lrun.0.size", ind));
     72 }
     73 
     74 static size_t
     75 get_huge_size(size_t ind)
     76 {
     77 
     78 	return (get_size_impl("arenas.hchunk.0.size", ind));
     79 }
     80 
     81 TEST_BEGIN(test_arena_reset)
     82 {
     83 #define	NHUGE	4
     84 	unsigned arena_ind, nsmall, nlarge, nhuge, nptrs, i;
     85 	size_t sz, miblen;
     86 	void **ptrs;
     87 	int flags;
     88 	size_t mib[3];
     89 	tsdn_t *tsdn;
     90 
     91 	test_skip_if((config_valgrind && unlikely(in_valgrind)) || (config_fill
     92 	    && unlikely(opt_quarantine)));
     93 
     94 	sz = sizeof(unsigned);
     95 	assert_d_eq(mallctl("arenas.extend", (void *)&arena_ind, &sz, NULL, 0),
     96 	    0, "Unexpected mallctl() failure");
     97 
     98 	flags = MALLOCX_ARENA(arena_ind) | MALLOCX_TCACHE_NONE;
     99 
    100 	nsmall = get_nsmall();
    101 	nlarge = get_nlarge();
    102 	nhuge = get_nhuge() > NHUGE ? NHUGE : get_nhuge();
    103 	nptrs = nsmall + nlarge + nhuge;
    104 	ptrs = (void **)malloc(nptrs * sizeof(void *));
    105 	assert_ptr_not_null(ptrs, "Unexpected malloc() failure");
    106 
    107 	/* Allocate objects with a wide range of sizes. */
    108 	for (i = 0; i < nsmall; i++) {
    109 		sz = get_small_size(i);
    110 		ptrs[i] = mallocx(sz, flags);
    111 		assert_ptr_not_null(ptrs[i],
    112 		    "Unexpected mallocx(%zu, %#x) failure", sz, flags);
    113 	}
    114 	for (i = 0; i < nlarge; i++) {
    115 		sz = get_large_size(i);
    116 		ptrs[nsmall + i] = mallocx(sz, flags);
    117 		assert_ptr_not_null(ptrs[i],
    118 		    "Unexpected mallocx(%zu, %#x) failure", sz, flags);
    119 	}
    120 	for (i = 0; i < nhuge; i++) {
    121 		sz = get_huge_size(i);
    122 		ptrs[nsmall + nlarge + i] = mallocx(sz, flags);
    123 		assert_ptr_not_null(ptrs[i],
    124 		    "Unexpected mallocx(%zu, %#x) failure", sz, flags);
    125 	}
    126 
    127 	tsdn = tsdn_fetch();
    128 
    129 	/* Verify allocations. */
    130 	for (i = 0; i < nptrs; i++) {
    131 		assert_zu_gt(ivsalloc(tsdn, ptrs[i], false), 0,
    132 		    "Allocation should have queryable size");
    133 	}
    134 
    135 	/* Reset. */
    136 	miblen = sizeof(mib)/sizeof(size_t);
    137 	assert_d_eq(mallctlnametomib("arena.0.reset", mib, &miblen), 0,
    138 	    "Unexpected mallctlnametomib() failure");
    139 	mib[1] = (size_t)arena_ind;
    140 	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0,
    141 	    "Unexpected mallctlbymib() failure");
    142 
    143 	/* Verify allocations no longer exist. */
    144 	for (i = 0; i < nptrs; i++) {
    145 		assert_zu_eq(ivsalloc(tsdn, ptrs[i], false), 0,
    146 		    "Allocation should no longer exist");
    147 	}
    148 
    149 	free(ptrs);
    150 }
    151 TEST_END
    152 
    153 int
    154 main(void)
    155 {
    156 
    157 	return (test(
    158 	    test_arena_reset));
    159 }
    160