1de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#include "test/jemalloc_test.h"
2de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
3de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_errors)
4de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
5de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	uint64_t epoch;
6de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz;
7de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
8de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("no_such_name", NULL, NULL, NULL, 0), ENOENT,
9de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctl() should return ENOENT for non-existent names");
10de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
11de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("version", NULL, NULL, "0.0.0", strlen("0.0.0")),
12de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    EPERM, "mallctl() should return EPERM on attempt to write "
13de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "read-only value");
14de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
158f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch,
168f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    sizeof(epoch)-1), EINVAL,
178f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    "mallctl() should return EINVAL for input size mismatch");
188f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch,
198f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    sizeof(epoch)+1), EINVAL,
208f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    "mallctl() should return EINVAL for input size mismatch");
21de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
22de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	sz = sizeof(epoch)-1;
238f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("epoch", (void *)&epoch, &sz, NULL, 0), EINVAL,
24de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctl() should return EINVAL for output size mismatch");
25de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	sz = sizeof(epoch)+1;
268f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("epoch", (void *)&epoch, &sz, NULL, 0), EINVAL,
27de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctl() should return EINVAL for output size mismatch");
28de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
29de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
30de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
31de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctlnametomib_errors)
32de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
33de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t mib[1];
34de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t miblen;
35de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
36de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	miblen = sizeof(mib)/sizeof(size_t);
37de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlnametomib("no_such_name", mib, &miblen), ENOENT,
38de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctlnametomib() should return ENOENT for non-existent names");
39de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
40de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
41de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
42de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctlbymib_errors)
43de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
44de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	uint64_t epoch;
45de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz;
46de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t mib[1];
47de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t miblen;
48de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
49de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	miblen = sizeof(mib)/sizeof(size_t);
50de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlnametomib("version", mib, &miblen), 0,
51de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlnametomib() failure");
52de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
53de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, "0.0.0",
54de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    strlen("0.0.0")), EPERM, "mallctl() should return EPERM on "
55de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "attempt to write read-only value");
56de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
57de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	miblen = sizeof(mib)/sizeof(size_t);
58de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlnametomib("epoch", mib, &miblen), 0,
59de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlnametomib() failure");
60de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
618f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, (void *)&epoch,
62de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    sizeof(epoch)-1), EINVAL,
63de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctlbymib() should return EINVAL for input size mismatch");
648f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, (void *)&epoch,
65de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    sizeof(epoch)+1), EINVAL,
66de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctlbymib() should return EINVAL for input size mismatch");
67de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
68de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	sz = sizeof(epoch)-1;
698f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctlbymib(mib, miblen, (void *)&epoch, &sz, NULL, 0),
708f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    EINVAL,
71de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctlbymib() should return EINVAL for output size mismatch");
72de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	sz = sizeof(epoch)+1;
738f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctlbymib(mib, miblen, (void *)&epoch, &sz, NULL, 0),
748f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    EINVAL,
75de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctlbymib() should return EINVAL for output size mismatch");
76de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
77de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
78de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
79de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_read_write)
80de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
81de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	uint64_t old_epoch, new_epoch;
82de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(old_epoch);
83de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
84de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	/* Blind. */
85de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("epoch", NULL, NULL, NULL, 0), 0,
86de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
87de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
88de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
89de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	/* Read. */
908f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("epoch", (void *)&old_epoch, &sz, NULL, 0), 0,
91de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
92de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
93de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
94de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	/* Write. */
958f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&new_epoch,
968f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    sizeof(new_epoch)), 0, "Unexpected mallctl() failure");
97de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
98de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
99de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	/* Read+write. */
1008f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("epoch", (void *)&old_epoch, &sz,
1018f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&new_epoch, sizeof(new_epoch)), 0,
1028f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    "Unexpected mallctl() failure");
103de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
104de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
105de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
106de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
107de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctlnametomib_short_mib)
108de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
109de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t mib[4];
110de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t miblen;
111de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
112de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	miblen = 3;
113de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	mib[3] = 42;
114de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlnametomib("arenas.bin.0.nregs", mib, &miblen), 0,
115de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlnametomib() failure");
116de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(miblen, 3, "Unexpected mib output length");
117de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(mib[3], 42,
118de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctlnametomib() wrote past the end of the input mib");
119de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
120de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
121de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
122de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_config)
123de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
124de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
125f829009929bdce17bef8a963264a92e39271a166Jason Evans#define	TEST_MALLCTL_CONFIG(config, t) do {				\
126f829009929bdce17bef8a963264a92e39271a166Jason Evans	t oldval;							\
127de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(oldval);					\
1288f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("config."#config, (void *)&oldval, &sz,	\
1298f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    NULL, 0), 0, "Unexpected mallctl() failure");		\
130de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_b_eq(oldval, config_##config, "Incorrect config value");	\
131de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(sz, sizeof(oldval), "Unexpected output size");	\
132de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
133de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
134f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(cache_oblivious, bool);
135f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(debug, bool);
136f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(fill, bool);
137f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(lazy_lock, bool);
138f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(malloc_conf, const char *);
139f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(munmap, bool);
140f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(prof, bool);
141f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(prof_libgcc, bool);
142f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(prof_libunwind, bool);
143f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(stats, bool);
144f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(tcache, bool);
145f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(tls, bool);
146f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(utrace, bool);
147f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(valgrind, bool);
148f829009929bdce17bef8a963264a92e39271a166Jason Evans	TEST_MALLCTL_CONFIG(xmalloc, bool);
149de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
150de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_MALLCTL_CONFIG
151de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
152de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
153de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
154de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_opt)
155de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
156de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	bool config_always = true;
157de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
158de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_MALLCTL_OPT(t, opt, config) do {				\
159de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t oldval;							\
160de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(oldval);					\
161de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	int expected = config_##config ? 0 : ENOENT;			\
1628f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	int result = mallctl("opt."#opt, (void *)&oldval, &sz, NULL,	\
1638f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    0);								\
164de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(result, expected,					\
165de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() result for opt."#opt);		\
166de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(sz, sizeof(oldval), "Unexpected output size");	\
167de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
168de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
169de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, abort, always);
170de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(size_t, lg_chunk, always);
171de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(const char *, dss, always);
1728f683b94a751c65af8f9fa25970ccf2917b96bb8Jason Evans	TEST_MALLCTL_OPT(unsigned, narenas, always);
173243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	TEST_MALLCTL_OPT(const char *, purge, always);
174de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(ssize_t, lg_dirty_mult, always);
175243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	TEST_MALLCTL_OPT(ssize_t, decay_time, always);
176de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, stats_print, always);
1772c5cb613dfbdf58f88152321b63e60c58cd23972Guilherme Goncalves	TEST_MALLCTL_OPT(const char *, junk, fill);
178de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(size_t, quarantine, fill);
179de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, redzone, fill);
180de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, zero, fill);
181de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, utrace, utrace);
182de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, xmalloc, xmalloc);
183de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, tcache, tcache);
184de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(size_t, lg_tcache_max, tcache);
185de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof, prof);
186de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(const char *, prof_prefix, prof);
187de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_active, prof);
188de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(ssize_t, lg_prof_sample, prof);
189de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_accum, prof);
190de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(ssize_t, lg_prof_interval, prof);
191de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_gdump, prof);
192de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_final, prof);
193de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_leak, prof);
194de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
195de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_MALLCTL_OPT
196de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
197de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
198de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
199de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_manpage_example)
200de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
201de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned nbins, i;
202de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t mib[4];
203de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t len, miblen;
204de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
205de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	len = sizeof(nbins);
2068f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas.nbins", (void *)&nbins, &len, NULL, 0), 0,
207de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
208de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
209de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	miblen = 4;
210de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlnametomib("arenas.bin.0.size", mib, &miblen), 0,
211de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlnametomib() failure");
212de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	for (i = 0; i < nbins; i++) {
213de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		size_t bin_size;
214de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
215de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		mib[2] = i;
216de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		len = sizeof(bin_size);
2178f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		assert_d_eq(mallctlbymib(mib, miblen, (void *)&bin_size, &len,
2188f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    NULL, 0), 0, "Unexpected mallctlbymib() failure");
219de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		/* Do something with bin_size... */
220de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	}
221de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
222de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
223de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
2241cb181ed632e7573fb4eab194e4d216867222d27Jason EvansTEST_BEGIN(test_tcache_none)
2251cb181ed632e7573fb4eab194e4d216867222d27Jason Evans{
2261cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	void *p0, *q, *p1;
2271cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2281cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	test_skip_if(!config_tcache);
2291cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2301cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Allocate p and q. */
2311cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	p0 = mallocx(42, 0);
2321cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	assert_ptr_not_null(p0, "Unexpected mallocx() failure");
2331cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	q = mallocx(42, 0);
2341cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	assert_ptr_not_null(q, "Unexpected mallocx() failure");
2351cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2361cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Deallocate p and q, but bypass the tcache for q. */
2371cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	dallocx(p0, 0);
2381cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	dallocx(q, MALLOCX_TCACHE_NONE);
2391cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2401cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Make sure that tcache-based allocation returns p, not q. */
2411cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	p1 = mallocx(42, 0);
2421cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	assert_ptr_not_null(p1, "Unexpected mallocx() failure");
2431cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	assert_ptr_eq(p0, p1, "Expected tcache to allocate cached region");
2441cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2451cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Clean up. */
2461cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	dallocx(p1, MALLOCX_TCACHE_NONE);
2471cb181ed632e7573fb4eab194e4d216867222d27Jason Evans}
2481cb181ed632e7573fb4eab194e4d216867222d27Jason EvansTEST_END
2491cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2501cb181ed632e7573fb4eab194e4d216867222d27Jason EvansTEST_BEGIN(test_tcache)
2511cb181ed632e7573fb4eab194e4d216867222d27Jason Evans{
2521cb181ed632e7573fb4eab194e4d216867222d27Jason Evans#define	NTCACHES	10
2531cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	unsigned tis[NTCACHES];
2541cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	void *ps[NTCACHES];
2551cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	void *qs[NTCACHES];
2561cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	unsigned i;
2571cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	size_t sz, psz, qsz;
2581cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2591cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	test_skip_if(!config_tcache);
2601cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2611cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	psz = 42;
2621cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	qsz = nallocx(psz, 0) + 1;
2631cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2641cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Create tcaches. */
2651cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES; i++) {
2661cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		sz = sizeof(unsigned);
2678f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		assert_d_eq(mallctl("tcache.create", (void *)&tis[i], &sz, NULL,
2688f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    0), 0, "Unexpected mallctl() failure, i=%u", i);
2691cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	}
2701cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2719e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans	/* Exercise tcache ID recycling. */
2729e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans	for (i = 0; i < NTCACHES; i++) {
2738f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		assert_d_eq(mallctl("tcache.destroy", NULL, NULL,
2748f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    (void *)&tis[i], sizeof(unsigned)), 0,
2758f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    "Unexpected mallctl() failure, i=%u", i);
2769e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans	}
2779e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans	for (i = 0; i < NTCACHES; i++) {
2789e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans		sz = sizeof(unsigned);
2798f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		assert_d_eq(mallctl("tcache.create", (void *)&tis[i], &sz, NULL,
2808f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    0), 0, "Unexpected mallctl() failure, i=%u", i);
2819e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans	}
2829e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans
2831cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Flush empty tcaches. */
2841cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES; i++) {
2858f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		assert_d_eq(mallctl("tcache.flush", NULL, NULL, (void *)&tis[i],
2861cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u",
2871cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    i);
2881cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	}
2891cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2901cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Cache some allocations. */
2911cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES; i++) {
2921cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		ps[i] = mallocx(psz, MALLOCX_TCACHE(tis[i]));
2931cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_ptr_not_null(ps[i], "Unexpected mallocx() failure, i=%u",
2941cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    i);
2951cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		dallocx(ps[i], MALLOCX_TCACHE(tis[i]));
2961cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2971cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		qs[i] = mallocx(qsz, MALLOCX_TCACHE(tis[i]));
2981cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_ptr_not_null(qs[i], "Unexpected mallocx() failure, i=%u",
2991cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    i);
3001cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		dallocx(qs[i], MALLOCX_TCACHE(tis[i]));
3011cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	}
3021cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
3031cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Verify that tcaches allocate cached regions. */
3041cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES; i++) {
3051cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		void *p0 = ps[i];
3061cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		ps[i] = mallocx(psz, MALLOCX_TCACHE(tis[i]));
3071cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_ptr_not_null(ps[i], "Unexpected mallocx() failure, i=%u",
3081cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    i);
3091cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_ptr_eq(ps[i], p0,
3101cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    "Expected mallocx() to allocate cached region, i=%u", i);
3111cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	}
3121cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
3131cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Verify that reallocation uses cached regions. */
3141cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES; i++) {
3151cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		void *q0 = qs[i];
3161cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		qs[i] = rallocx(ps[i], qsz, MALLOCX_TCACHE(tis[i]));
3171cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_ptr_not_null(qs[i], "Unexpected rallocx() failure, i=%u",
3181cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    i);
3191cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_ptr_eq(qs[i], q0,
3201cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    "Expected rallocx() to allocate cached region, i=%u", i);
3211cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		/* Avoid undefined behavior in case of test failure. */
3221cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		if (qs[i] == NULL)
3231cb181ed632e7573fb4eab194e4d216867222d27Jason Evans			qs[i] = ps[i];
3241cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	}
3251cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES; i++)
3261cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		dallocx(qs[i], MALLOCX_TCACHE(tis[i]));
3271cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
3281cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Flush some non-empty tcaches. */
3291cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES/2; i++) {
3308f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		assert_d_eq(mallctl("tcache.flush", NULL, NULL, (void *)&tis[i],
3311cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u",
3321cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    i);
3331cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	}
3341cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
3351cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Destroy tcaches. */
3361cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES; i++) {
3378f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		assert_d_eq(mallctl("tcache.destroy", NULL, NULL,
3388f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    (void *)&tis[i], sizeof(unsigned)), 0,
3398f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    "Unexpected mallctl() failure, i=%u", i);
3401cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	}
3411cb181ed632e7573fb4eab194e4d216867222d27Jason Evans}
3421cb181ed632e7573fb4eab194e4d216867222d27Jason EvansTEST_END
3431cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
344de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_thread_arena)
345de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
346de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned arena_old, arena_new, narenas;
347de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(unsigned);
348de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
3498f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0),
3508f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    0, "Unexpected mallctl() failure");
351de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_u_eq(narenas, opt_narenas, "Number of arenas incorrect");
352de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	arena_new = narenas - 1;
3538f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("thread.arena", (void *)&arena_old, &sz,
3548f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&arena_new, sizeof(unsigned)), 0,
3558f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    "Unexpected mallctl() failure");
356de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	arena_new = 0;
3578f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("thread.arena", (void *)&arena_old, &sz,
3588f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&arena_new, sizeof(unsigned)), 0,
3598f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    "Unexpected mallctl() failure");
360de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
361de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
362de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
3638d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason EvansTEST_BEGIN(test_arena_i_lg_dirty_mult)
3648d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans{
3658d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	ssize_t lg_dirty_mult, orig_lg_dirty_mult, prev_lg_dirty_mult;
3668d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	size_t sz = sizeof(ssize_t);
3678d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
368243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	test_skip_if(opt_purge != purge_mode_ratio);
369243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
3708f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arena.0.lg_dirty_mult",
3718f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&orig_lg_dirty_mult, &sz, NULL, 0), 0,
3728f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    "Unexpected mallctl() failure");
3738d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
3748d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	lg_dirty_mult = -2;
3758d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	assert_d_eq(mallctl("arena.0.lg_dirty_mult", NULL, NULL,
3768f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&lg_dirty_mult, sizeof(ssize_t)), EFAULT,
3778d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    "Unexpected mallctl() success");
3788d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
3798d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	lg_dirty_mult = (sizeof(size_t) << 3);
3808d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	assert_d_eq(mallctl("arena.0.lg_dirty_mult", NULL, NULL,
3818f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&lg_dirty_mult, sizeof(ssize_t)), EFAULT,
3828d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    "Unexpected mallctl() success");
3838d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
3848d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	for (prev_lg_dirty_mult = orig_lg_dirty_mult, lg_dirty_mult = -1;
385bd16ea49c3e36706a52ef9c8f560813c167fa085Jason Evans	    lg_dirty_mult < (ssize_t)(sizeof(size_t) << 3); prev_lg_dirty_mult
386bd16ea49c3e36706a52ef9c8f560813c167fa085Jason Evans	    = lg_dirty_mult, lg_dirty_mult++) {
3878d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		ssize_t old_lg_dirty_mult;
3888d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
3898f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		assert_d_eq(mallctl("arena.0.lg_dirty_mult",
3908f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    (void *)&old_lg_dirty_mult, &sz, (void *)&lg_dirty_mult,
3918f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    sizeof(ssize_t)), 0, "Unexpected mallctl() failure");
3928d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		assert_zd_eq(old_lg_dirty_mult, prev_lg_dirty_mult,
3938d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		    "Unexpected old arena.0.lg_dirty_mult");
3948d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	}
3958d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans}
3968d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason EvansTEST_END
3978d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
398243f7a0508bb014c2a7bf592c466a923911db234Jason EvansTEST_BEGIN(test_arena_i_decay_time)
399243f7a0508bb014c2a7bf592c466a923911db234Jason Evans{
400243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	ssize_t decay_time, orig_decay_time, prev_decay_time;
401243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	size_t sz = sizeof(ssize_t);
402243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
403243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	test_skip_if(opt_purge != purge_mode_decay);
404243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
4058f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arena.0.decay_time", (void *)&orig_decay_time, &sz,
406243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	    NULL, 0), 0, "Unexpected mallctl() failure");
407243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
408243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	decay_time = -2;
409243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	assert_d_eq(mallctl("arena.0.decay_time", NULL, NULL,
4108f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&decay_time, sizeof(ssize_t)), EFAULT,
411243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	    "Unexpected mallctl() success");
412243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
4139bad07903962962de9f656d281b9b1e7e9501c87Jason Evans	decay_time = 0x7fffffff;
414243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	assert_d_eq(mallctl("arena.0.decay_time", NULL, NULL,
4158f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&decay_time, sizeof(ssize_t)), 0,
416243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	    "Unexpected mallctl() failure");
417243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
418243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	for (prev_decay_time = decay_time, decay_time = -1;
419243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	    decay_time < 20; prev_decay_time = decay_time, decay_time++) {
420243f7a0508bb014c2a7bf592c466a923911db234Jason Evans		ssize_t old_decay_time;
421243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
4228f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		assert_d_eq(mallctl("arena.0.decay_time", (void *)&old_decay_time,
4238f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    &sz, (void *)&decay_time, sizeof(ssize_t)), 0,
424243f7a0508bb014c2a7bf592c466a923911db234Jason Evans		    "Unexpected mallctl() failure");
425243f7a0508bb014c2a7bf592c466a923911db234Jason Evans		assert_zd_eq(old_decay_time, prev_decay_time,
426243f7a0508bb014c2a7bf592c466a923911db234Jason Evans		    "Unexpected old arena.0.decay_time");
427243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	}
428243f7a0508bb014c2a7bf592c466a923911db234Jason Evans}
429243f7a0508bb014c2a7bf592c466a923911db234Jason EvansTEST_END
430243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
431de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arena_i_purge)
432de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
433de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned narenas;
434de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(unsigned);
435de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t mib[3];
436de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t miblen = 3;
437de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
438de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
439de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
440de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
4418f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0),
4428f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    0, "Unexpected mallctl() failure");
443de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlnametomib("arena.0.purge", mib, &miblen), 0,
444de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlnametomib() failure");
445de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	mib[1] = narenas;
446de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0,
447de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlbymib() failure");
448de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
449de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
450de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
451243f7a0508bb014c2a7bf592c466a923911db234Jason EvansTEST_BEGIN(test_arena_i_decay)
452243f7a0508bb014c2a7bf592c466a923911db234Jason Evans{
453243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	unsigned narenas;
454243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	size_t sz = sizeof(unsigned);
455243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	size_t mib[3];
456243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	size_t miblen = 3;
457243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
458243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	assert_d_eq(mallctl("arena.0.decay", NULL, NULL, NULL, 0), 0,
459243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	    "Unexpected mallctl() failure");
460243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
4618f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0),
4628f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    0, "Unexpected mallctl() failure");
463243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	assert_d_eq(mallctlnametomib("arena.0.decay", mib, &miblen), 0,
464243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	    "Unexpected mallctlnametomib() failure");
465243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	mib[1] = narenas;
466243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0,
467243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	    "Unexpected mallctlbymib() failure");
468243f7a0508bb014c2a7bf592c466a923911db234Jason Evans}
469243f7a0508bb014c2a7bf592c466a923911db234Jason EvansTEST_END
470243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
471de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arena_i_dss)
472de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
473de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	const char *dss_prec_old, *dss_prec_new;
474de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(dss_prec_old);
4754d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	size_t mib[3];
4764d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	size_t miblen;
4774d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans
4784d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	miblen = sizeof(mib)/sizeof(size_t);
4794d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	assert_d_eq(mallctlnametomib("arena.0.dss", mib, &miblen), 0,
4804d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	    "Unexpected mallctlnametomib() error");
481de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
4824d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	dss_prec_new = "disabled";
4838f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz,
4848f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&dss_prec_new, sizeof(dss_prec_new)), 0,
4858f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    "Unexpected mallctl() failure");
486de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_str_ne(dss_prec_old, "primary",
487de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected default for dss precedence");
488de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
4898f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_new, &sz,
4908f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&dss_prec_old, sizeof(dss_prec_old)), 0,
491586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	    "Unexpected mallctl() failure");
4928f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans
4938f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz, NULL,
4948f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    0), 0, "Unexpected mallctl() failure");
495586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	assert_str_ne(dss_prec_old, "primary",
496586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	    "Unexpected value for dss precedence");
497586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans
4984d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	mib[1] = narenas_total_get();
4994d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	dss_prec_new = "disabled";
5008f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz,
5018f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&dss_prec_new, sizeof(dss_prec_new)), 0,
5028f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    "Unexpected mallctl() failure");
5034d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	assert_str_ne(dss_prec_old, "primary",
5044d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	    "Unexpected default for dss precedence");
505586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans
5068f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_new, &sz,
5078f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&dss_prec_old, sizeof(dss_prec_new)), 0,
508586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	    "Unexpected mallctl() failure");
5098f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans
5108f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz, NULL,
5118f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    0), 0, "Unexpected mallctl() failure");
512586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	assert_str_ne(dss_prec_old, "primary",
513586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	    "Unexpected value for dss precedence");
514de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
515de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
516de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
517de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_initialized)
518de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
519de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned narenas;
520de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(narenas);
521de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
5228f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0),
5238f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    0, "Unexpected mallctl() failure");
524de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	{
525f41f14366877538b03109ecf346dbff2e21bbb16Mike Hommey		VARIABLE_ARRAY(bool, initialized, narenas);
526de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
527de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		sz = narenas * sizeof(bool);
5288f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		assert_d_eq(mallctl("arenas.initialized", (void *)initialized,
5298f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    &sz, NULL, 0), 0, "Unexpected mallctl() failure");
530de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	}
531de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
532de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
533de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
5348d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason EvansTEST_BEGIN(test_arenas_lg_dirty_mult)
5358d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans{
5368d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	ssize_t lg_dirty_mult, orig_lg_dirty_mult, prev_lg_dirty_mult;
5378d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	size_t sz = sizeof(ssize_t);
5388d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
539243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	test_skip_if(opt_purge != purge_mode_ratio);
540243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
5418f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas.lg_dirty_mult", (void *)&orig_lg_dirty_mult,
5428f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    &sz, NULL, 0), 0, "Unexpected mallctl() failure");
5438d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
5448d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	lg_dirty_mult = -2;
5458d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	assert_d_eq(mallctl("arenas.lg_dirty_mult", NULL, NULL,
5468f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&lg_dirty_mult, sizeof(ssize_t)), EFAULT,
5478d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    "Unexpected mallctl() success");
5488d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
5498d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	lg_dirty_mult = (sizeof(size_t) << 3);
5508d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	assert_d_eq(mallctl("arenas.lg_dirty_mult", NULL, NULL,
5518f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&lg_dirty_mult, sizeof(ssize_t)), EFAULT,
5528d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    "Unexpected mallctl() success");
5538d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
5548d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	for (prev_lg_dirty_mult = orig_lg_dirty_mult, lg_dirty_mult = -1;
555bd16ea49c3e36706a52ef9c8f560813c167fa085Jason Evans	    lg_dirty_mult < (ssize_t)(sizeof(size_t) << 3); prev_lg_dirty_mult =
5568d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    lg_dirty_mult, lg_dirty_mult++) {
5578d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		ssize_t old_lg_dirty_mult;
5588d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
5598f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		assert_d_eq(mallctl("arenas.lg_dirty_mult",
5608f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    (void *)&old_lg_dirty_mult, &sz, (void *)&lg_dirty_mult,
5618f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    sizeof(ssize_t)), 0, "Unexpected mallctl() failure");
5628d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		assert_zd_eq(old_lg_dirty_mult, prev_lg_dirty_mult,
5638d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		    "Unexpected old arenas.lg_dirty_mult");
5648d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	}
5658d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans}
5668d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason EvansTEST_END
5678d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
568243f7a0508bb014c2a7bf592c466a923911db234Jason EvansTEST_BEGIN(test_arenas_decay_time)
569243f7a0508bb014c2a7bf592c466a923911db234Jason Evans{
570243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	ssize_t decay_time, orig_decay_time, prev_decay_time;
571243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	size_t sz = sizeof(ssize_t);
572243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
573243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	test_skip_if(opt_purge != purge_mode_decay);
574243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
5758f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas.decay_time", (void *)&orig_decay_time, &sz,
576243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	    NULL, 0), 0, "Unexpected mallctl() failure");
577243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
578243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	decay_time = -2;
579243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	assert_d_eq(mallctl("arenas.decay_time", NULL, NULL,
5808f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&decay_time, sizeof(ssize_t)), EFAULT,
581243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	    "Unexpected mallctl() success");
582243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
5839bad07903962962de9f656d281b9b1e7e9501c87Jason Evans	decay_time = 0x7fffffff;
584243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	assert_d_eq(mallctl("arenas.decay_time", NULL, NULL,
5858f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    (void *)&decay_time, sizeof(ssize_t)), 0,
586243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	    "Expected mallctl() failure");
587243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
588243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	for (prev_decay_time = decay_time, decay_time = -1;
589243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	    decay_time < 20; prev_decay_time = decay_time, decay_time++) {
590243f7a0508bb014c2a7bf592c466a923911db234Jason Evans		ssize_t old_decay_time;
591243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
5928f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		assert_d_eq(mallctl("arenas.decay_time",
5938f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    (void *)&old_decay_time, &sz, (void *)&decay_time,
5948f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans		    sizeof(ssize_t)), 0, "Unexpected mallctl() failure");
595243f7a0508bb014c2a7bf592c466a923911db234Jason Evans		assert_zd_eq(old_decay_time, prev_decay_time,
596243f7a0508bb014c2a7bf592c466a923911db234Jason Evans		    "Unexpected old arenas.decay_time");
597243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	}
598243f7a0508bb014c2a7bf592c466a923911db234Jason Evans}
599243f7a0508bb014c2a7bf592c466a923911db234Jason EvansTEST_END
600243f7a0508bb014c2a7bf592c466a923911db234Jason Evans
601de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_constants)
602de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
603de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
604de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_ARENAS_CONSTANT(t, name, expected) do {			\
605de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t name;								\
606de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(t);						\
6078f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas."#name, (void *)&name, &sz, NULL,	\
6088f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    0), 0, "Unexpected mallctl() failure");			\
609de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
610de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
611de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
612de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_CONSTANT(size_t, quantum, QUANTUM);
613de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_CONSTANT(size_t, page, PAGE);
614de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_CONSTANT(unsigned, nbins, NBINS);
6153c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	TEST_ARENAS_CONSTANT(unsigned, nlruns, nlclasses);
6163c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	TEST_ARENAS_CONSTANT(unsigned, nhchunks, nhclasses);
617de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
618de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_CONSTANT
619de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
620de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
621de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
622de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_bin_constants)
623de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
624de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
625de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_ARENAS_BIN_CONSTANT(t, name, expected) do {		\
626de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t name;								\
627de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(t);						\
6288f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas.bin.0."#name, (void *)&name, &sz,	\
6298f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    NULL, 0), 0, "Unexpected mallctl() failure");		\
630de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
631de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
632de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
633de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_BIN_CONSTANT(size_t, size, arena_bin_info[0].reg_size);
634de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_BIN_CONSTANT(uint32_t, nregs, arena_bin_info[0].nregs);
635de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_BIN_CONSTANT(size_t, run_size, arena_bin_info[0].run_size);
636de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
637de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_BIN_CONSTANT
638de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
639de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
640de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
641de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_lrun_constants)
642de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
643de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
644de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_ARENAS_LRUN_CONSTANT(t, name, expected) do {		\
645de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t name;								\
646de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(t);						\
6478f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas.lrun.0."#name, (void *)&name, &sz,	\
6488f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    NULL, 0), 0, "Unexpected mallctl() failure");		\
649de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
650de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
651de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
652fc0b3b7383373d66cfed2cd4e2faa272a6868d32Jason Evans	TEST_ARENAS_LRUN_CONSTANT(size_t, size, LARGE_MINCLASS);
653de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
654de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_LRUN_CONSTANT
655de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
656de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
657de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
6583c4d92e82a31f652a7c77ca937a02d0185085b06Jason EvansTEST_BEGIN(test_arenas_hchunk_constants)
6593c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans{
6603c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans
6613c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans#define	TEST_ARENAS_HCHUNK_CONSTANT(t, name, expected) do {		\
6623c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	t name;								\
6633c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	size_t sz = sizeof(t);						\
6648f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas.hchunk.0."#name, (void *)&name,	\
6658f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    &sz, NULL, 0), 0, "Unexpected mallctl() failure");		\
6663c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
6673c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans} while (0)
6683c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans
6693c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	TEST_ARENAS_HCHUNK_CONSTANT(size_t, size, chunksize);
6703c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans
6713c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans#undef TEST_ARENAS_HCHUNK_CONSTANT
6723c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans}
6733c4d92e82a31f652a7c77ca937a02d0185085b06Jason EvansTEST_END
6743c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans
675de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_extend)
676de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
677de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned narenas_before, arena, narenas_after;
678de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(unsigned);
679de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
6808f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas.narenas", (void *)&narenas_before, &sz,
6818f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    NULL, 0), 0, "Unexpected mallctl() failure");
6828f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas.extend", (void *)&arena, &sz, NULL, 0), 0,
683de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
6848f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("arenas.narenas", (void *)&narenas_after, &sz, NULL,
6858f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    0), 0, "Unexpected mallctl() failure");
686de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
687de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_u_eq(narenas_before+1, narenas_after,
688de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected number of arenas before versus after extension");
689de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_u_eq(arena, narenas_after-1, "Unexpected arena index");
690de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
691de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
692de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
693de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_stats_arenas)
694de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
695de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
696de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_STATS_ARENAS(t, name) do {					\
697de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t name;								\
698de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(t);						\
6998f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	assert_d_eq(mallctl("stats.arenas.0."#name, (void *)&name, &sz,	\
7008f61fdedb908c29905103b22dda32ceb29cd8edeJason Evans	    NULL, 0), 0, "Unexpected mallctl() failure");		\
701de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
702de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
703de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_STATS_ARENAS(unsigned, nthreads);
7043c07f803aa282598451eb0664cc94717b769a5e6Jason Evans	TEST_STATS_ARENAS(const char *, dss);
7053c07f803aa282598451eb0664cc94717b769a5e6Jason Evans	TEST_STATS_ARENAS(ssize_t, lg_dirty_mult);
7063c07f803aa282598451eb0664cc94717b769a5e6Jason Evans	TEST_STATS_ARENAS(ssize_t, decay_time);
707de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_STATS_ARENAS(size_t, pactive);
708de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_STATS_ARENAS(size_t, pdirty);
709de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
710de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_STATS_ARENAS
711de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
712de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
713de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
714de73296d6b56abe70b08654342e136c2612d1dbdJason Evansint
715de73296d6b56abe70b08654342e136c2612d1dbdJason Evansmain(void)
716de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
717de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
718de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	return (test(
719de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctl_errors,
720de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctlnametomib_errors,
721de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctlbymib_errors,
722de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctl_read_write,
723de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctlnametomib_short_mib,
724de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctl_config,
725de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctl_opt,
726de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_manpage_example,
7271cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	    test_tcache_none,
7281cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	    test_tcache,
729de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_thread_arena,
7308d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    test_arena_i_lg_dirty_mult,
731243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	    test_arena_i_decay_time,
732de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arena_i_purge,
733243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	    test_arena_i_decay,
734de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arena_i_dss,
735de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_initialized,
7368d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    test_arenas_lg_dirty_mult,
737243f7a0508bb014c2a7bf592c466a923911db234Jason Evans	    test_arenas_decay_time,
738de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_constants,
739de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_bin_constants,
740de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_lrun_constants,
7413c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	    test_arenas_hchunk_constants,
742de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_extend,
743de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_stats_arenas));
744de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
745