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