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
15de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)-1),
16de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    EINVAL, "mallctl() should return EINVAL for input size mismatch");
17de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)+1),
18de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    EINVAL, "mallctl() should return EINVAL for input size mismatch");
19de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
20de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	sz = sizeof(epoch)-1;
21de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("epoch", &epoch, &sz, NULL, 0), EINVAL,
22de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctl() should return EINVAL for output size mismatch");
23de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	sz = sizeof(epoch)+1;
24de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("epoch", &epoch, &sz, NULL, 0), EINVAL,
25de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctl() should return EINVAL for output size mismatch");
26de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
27de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
28de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
29de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctlnametomib_errors)
30de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
31de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t mib[1];
32de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t miblen;
33de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
34de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	miblen = sizeof(mib)/sizeof(size_t);
35de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlnametomib("no_such_name", mib, &miblen), ENOENT,
36de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctlnametomib() should return ENOENT for non-existent names");
37de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
38de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
39de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
40de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctlbymib_errors)
41de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
42de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	uint64_t epoch;
43de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz;
44de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t mib[1];
45de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t miblen;
46de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
47de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	miblen = sizeof(mib)/sizeof(size_t);
48de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlnametomib("version", mib, &miblen), 0,
49de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlnametomib() failure");
50de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
51de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, "0.0.0",
52de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    strlen("0.0.0")), EPERM, "mallctl() should return EPERM on "
53de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "attempt to write read-only value");
54de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
55de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	miblen = sizeof(mib)/sizeof(size_t);
56de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlnametomib("epoch", mib, &miblen), 0,
57de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlnametomib() failure");
58de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
59de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, &epoch,
60de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    sizeof(epoch)-1), EINVAL,
61de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctlbymib() should return EINVAL for input size mismatch");
62de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, &epoch,
63de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    sizeof(epoch)+1), EINVAL,
64de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctlbymib() should return EINVAL for input size mismatch");
65de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
66de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	sz = sizeof(epoch)-1;
67de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlbymib(mib, miblen, &epoch, &sz, NULL, 0), EINVAL,
68de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctlbymib() should return EINVAL for output size mismatch");
69de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	sz = sizeof(epoch)+1;
70de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlbymib(mib, miblen, &epoch, &sz, NULL, 0), EINVAL,
71de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctlbymib() should return EINVAL for output size mismatch");
72de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
73de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
74de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
75de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_read_write)
76de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
77de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	uint64_t old_epoch, new_epoch;
78de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(old_epoch);
79de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
80de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	/* Blind. */
81de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("epoch", NULL, NULL, NULL, 0), 0,
82de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
83de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
84de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
85de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	/* Read. */
86de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("epoch", &old_epoch, &sz, NULL, 0), 0,
87de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
88de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
89de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
90de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	/* Write. */
91de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("epoch", NULL, NULL, &new_epoch, sizeof(new_epoch)),
92de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    0, "Unexpected mallctl() failure");
93de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
94de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
95de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	/* Read+write. */
96de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("epoch", &old_epoch, &sz, &new_epoch,
97de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    sizeof(new_epoch)), 0, "Unexpected mallctl() failure");
98de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
99de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
100de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
101de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
102de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctlnametomib_short_mib)
103de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
104de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t mib[4];
105de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t miblen;
106de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
107de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	miblen = 3;
108de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	mib[3] = 42;
109de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlnametomib("arenas.bin.0.nregs", mib, &miblen), 0,
110de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlnametomib() failure");
111de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(miblen, 3, "Unexpected mib output length");
112de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(mib[3], 42,
113de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "mallctlnametomib() wrote past the end of the input mib");
114de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
115de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
116de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
117de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_config)
118de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
119de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
120e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris#define	TEST_MALLCTL_CONFIG(config, t) do {				\
121e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	t oldval;							\
122de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(oldval);					\
123de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("config."#config, &oldval, &sz, NULL, 0),	\
124de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    0, "Unexpected mallctl() failure");				\
125de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_b_eq(oldval, config_##config, "Incorrect config value");	\
126de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(sz, sizeof(oldval), "Unexpected output size");	\
127de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
128de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
129e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(cache_oblivious, bool);
130e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(debug, bool);
131e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(fill, bool);
132e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(lazy_lock, bool);
133e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(malloc_conf, const char *);
134e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(munmap, bool);
135e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(prof, bool);
136e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(prof_libgcc, bool);
137e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(prof_libunwind, bool);
138e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(stats, bool);
139e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(tcache, bool);
140e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(tls, bool);
141e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(utrace, bool);
142e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(valgrind, bool);
143e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_CONFIG(xmalloc, bool);
144de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
145de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_MALLCTL_CONFIG
146de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
147de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
148de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
149de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_opt)
150de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
151de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	bool config_always = true;
152de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
153de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_MALLCTL_OPT(t, opt, config) do {				\
154de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t oldval;							\
155de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(oldval);					\
156de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	int expected = config_##config ? 0 : ENOENT;			\
157de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	int result = mallctl("opt."#opt, &oldval, &sz, NULL, 0);	\
158de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(result, expected,					\
159de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() result for opt."#opt);		\
160de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(sz, sizeof(oldval), "Unexpected output size");	\
161de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
162de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
163de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, abort, always);
164de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(size_t, lg_chunk, always);
165de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(const char *, dss, always);
166e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_OPT(unsigned, narenas, always);
167e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_OPT(const char *, purge, always);
168de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(ssize_t, lg_dirty_mult, always);
169e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_MALLCTL_OPT(ssize_t, decay_time, always);
170de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, stats_print, always);
1712c5cb613dfbdf58f88152321b63e60c58cd23972Guilherme Goncalves	TEST_MALLCTL_OPT(const char *, junk, fill);
172de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(size_t, quarantine, fill);
173de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, redzone, fill);
174de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, zero, fill);
175de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, utrace, utrace);
176de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, xmalloc, xmalloc);
177de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, tcache, tcache);
178de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(size_t, lg_tcache_max, tcache);
179de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof, prof);
180de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(const char *, prof_prefix, prof);
181de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_active, prof);
182de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(ssize_t, lg_prof_sample, prof);
183de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_accum, prof);
184de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(ssize_t, lg_prof_interval, prof);
185de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_gdump, prof);
186de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_final, prof);
187de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_leak, prof);
188de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
189de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_MALLCTL_OPT
190de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
191de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
192de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
193de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_manpage_example)
194de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
195de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned nbins, i;
196de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t mib[4];
197de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t len, miblen;
198de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
199de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	len = sizeof(nbins);
200de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.nbins", &nbins, &len, NULL, 0), 0,
201de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
202de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
203de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	miblen = 4;
204de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlnametomib("arenas.bin.0.size", mib, &miblen), 0,
205de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlnametomib() failure");
206de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	for (i = 0; i < nbins; i++) {
207de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		size_t bin_size;
208de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
209de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		mib[2] = i;
210de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		len = sizeof(bin_size);
211de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		assert_d_eq(mallctlbymib(mib, miblen, &bin_size, &len, NULL, 0),
212de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		    0, "Unexpected mallctlbymib() failure");
213de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		/* Do something with bin_size... */
214de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	}
215de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
216de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
217de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
2181cb181ed632e7573fb4eab194e4d216867222d27Jason EvansTEST_BEGIN(test_tcache_none)
2191cb181ed632e7573fb4eab194e4d216867222d27Jason Evans{
2201cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	void *p0, *q, *p1;
2211cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2221cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	test_skip_if(!config_tcache);
2231cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2241cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Allocate p and q. */
2251cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	p0 = mallocx(42, 0);
2261cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	assert_ptr_not_null(p0, "Unexpected mallocx() failure");
2271cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	q = mallocx(42, 0);
2281cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	assert_ptr_not_null(q, "Unexpected mallocx() failure");
2291cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2301cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Deallocate p and q, but bypass the tcache for q. */
2311cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	dallocx(p0, 0);
2321cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	dallocx(q, MALLOCX_TCACHE_NONE);
2331cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2341cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Make sure that tcache-based allocation returns p, not q. */
2351cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	p1 = mallocx(42, 0);
2361cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	assert_ptr_not_null(p1, "Unexpected mallocx() failure");
2371cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	assert_ptr_eq(p0, p1, "Expected tcache to allocate cached region");
2381cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2391cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Clean up. */
2401cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	dallocx(p1, MALLOCX_TCACHE_NONE);
2411cb181ed632e7573fb4eab194e4d216867222d27Jason Evans}
2421cb181ed632e7573fb4eab194e4d216867222d27Jason EvansTEST_END
2431cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2441cb181ed632e7573fb4eab194e4d216867222d27Jason EvansTEST_BEGIN(test_tcache)
2451cb181ed632e7573fb4eab194e4d216867222d27Jason Evans{
2461cb181ed632e7573fb4eab194e4d216867222d27Jason Evans#define	NTCACHES	10
2471cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	unsigned tis[NTCACHES];
2481cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	void *ps[NTCACHES];
2491cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	void *qs[NTCACHES];
2501cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	unsigned i;
2511cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	size_t sz, psz, qsz;
2521cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2531cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	test_skip_if(!config_tcache);
2541cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2551cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	psz = 42;
2561cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	qsz = nallocx(psz, 0) + 1;
2571cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2581cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Create tcaches. */
2591cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES; i++) {
2601cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		sz = sizeof(unsigned);
2611cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_d_eq(mallctl("tcache.create", &tis[i], &sz, NULL, 0), 0,
2621cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    "Unexpected mallctl() failure, i=%u", i);
2631cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	}
2641cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2659e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans	/* Exercise tcache ID recycling. */
2669e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans	for (i = 0; i < NTCACHES; i++) {
2679e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans		assert_d_eq(mallctl("tcache.destroy", NULL, NULL, &tis[i],
2689e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans		    sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u",
2699e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans		    i);
2709e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans	}
2719e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans	for (i = 0; i < NTCACHES; i++) {
2729e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans		sz = sizeof(unsigned);
2739e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans		assert_d_eq(mallctl("tcache.create", &tis[i], &sz, NULL, 0), 0,
2749e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans		    "Unexpected mallctl() failure, i=%u", i);
2759e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans	}
2769e561e8d3f3c625b98b57df069eeac0fa2f522fbJason Evans
2771cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Flush empty tcaches. */
2781cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES; i++) {
2791cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_d_eq(mallctl("tcache.flush", NULL, NULL, &tis[i],
2801cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u",
2811cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    i);
2821cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	}
2831cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2841cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Cache some allocations. */
2851cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES; i++) {
2861cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		ps[i] = mallocx(psz, MALLOCX_TCACHE(tis[i]));
2871cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_ptr_not_null(ps[i], "Unexpected mallocx() failure, i=%u",
2881cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    i);
2891cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		dallocx(ps[i], MALLOCX_TCACHE(tis[i]));
2901cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2911cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		qs[i] = mallocx(qsz, MALLOCX_TCACHE(tis[i]));
2921cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_ptr_not_null(qs[i], "Unexpected mallocx() failure, i=%u",
2931cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    i);
2941cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		dallocx(qs[i], MALLOCX_TCACHE(tis[i]));
2951cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	}
2961cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
2971cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Verify that tcaches allocate cached regions. */
2981cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES; i++) {
2991cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		void *p0 = ps[i];
3001cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		ps[i] = mallocx(psz, MALLOCX_TCACHE(tis[i]));
3011cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_ptr_not_null(ps[i], "Unexpected mallocx() failure, i=%u",
3021cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    i);
3031cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_ptr_eq(ps[i], p0,
3041cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    "Expected mallocx() to allocate cached region, i=%u", i);
3051cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	}
3061cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
3071cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Verify that reallocation uses cached regions. */
3081cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES; i++) {
3091cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		void *q0 = qs[i];
3101cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		qs[i] = rallocx(ps[i], qsz, MALLOCX_TCACHE(tis[i]));
3111cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_ptr_not_null(qs[i], "Unexpected rallocx() failure, i=%u",
3121cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    i);
3131cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_ptr_eq(qs[i], q0,
3141cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    "Expected rallocx() to allocate cached region, i=%u", i);
3151cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		/* Avoid undefined behavior in case of test failure. */
3161cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		if (qs[i] == NULL)
3171cb181ed632e7573fb4eab194e4d216867222d27Jason Evans			qs[i] = ps[i];
3181cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	}
3191cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES; i++)
3201cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		dallocx(qs[i], MALLOCX_TCACHE(tis[i]));
3211cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
3221cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Flush some non-empty tcaches. */
3231cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES/2; i++) {
3241cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_d_eq(mallctl("tcache.flush", NULL, NULL, &tis[i],
3251cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u",
3261cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    i);
3271cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	}
3281cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
3291cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	/* Destroy tcaches. */
3301cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	for (i = 0; i < NTCACHES; i++) {
3311cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		assert_d_eq(mallctl("tcache.destroy", NULL, NULL, &tis[i],
3321cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u",
3331cb181ed632e7573fb4eab194e4d216867222d27Jason Evans		    i);
3341cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	}
3351cb181ed632e7573fb4eab194e4d216867222d27Jason Evans}
3361cb181ed632e7573fb4eab194e4d216867222d27Jason EvansTEST_END
3371cb181ed632e7573fb4eab194e4d216867222d27Jason Evans
338de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_thread_arena)
339de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
340de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned arena_old, arena_new, narenas;
341de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(unsigned);
342de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
343de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.narenas", &narenas, &sz, NULL, 0), 0,
344de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
345de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_u_eq(narenas, opt_narenas, "Number of arenas incorrect");
346de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	arena_new = narenas - 1;
347de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("thread.arena", &arena_old, &sz, &arena_new,
348de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    sizeof(unsigned)), 0, "Unexpected mallctl() failure");
349de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	arena_new = 0;
350de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("thread.arena", &arena_old, &sz, &arena_new,
351de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    sizeof(unsigned)), 0, "Unexpected mallctl() failure");
352de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
353de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
354de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
3558d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason EvansTEST_BEGIN(test_arena_i_lg_dirty_mult)
3568d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans{
3578d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	ssize_t lg_dirty_mult, orig_lg_dirty_mult, prev_lg_dirty_mult;
3588d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	size_t sz = sizeof(ssize_t);
3598d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
360e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	test_skip_if(opt_purge != purge_mode_ratio);
361e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
3628d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	assert_d_eq(mallctl("arena.0.lg_dirty_mult", &orig_lg_dirty_mult, &sz,
3638d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    NULL, 0), 0, "Unexpected mallctl() failure");
3648d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
3658d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	lg_dirty_mult = -2;
3668d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	assert_d_eq(mallctl("arena.0.lg_dirty_mult", NULL, NULL,
3678d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    &lg_dirty_mult, sizeof(ssize_t)), EFAULT,
3688d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    "Unexpected mallctl() success");
3698d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
3708d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	lg_dirty_mult = (sizeof(size_t) << 3);
3718d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	assert_d_eq(mallctl("arena.0.lg_dirty_mult", NULL, NULL,
3728d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    &lg_dirty_mult, sizeof(ssize_t)), EFAULT,
3738d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    "Unexpected mallctl() success");
3748d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
3758d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	for (prev_lg_dirty_mult = orig_lg_dirty_mult, lg_dirty_mult = -1;
376bd16ea49c3e36706a52ef9c8f560813c167fa085Jason Evans	    lg_dirty_mult < (ssize_t)(sizeof(size_t) << 3); prev_lg_dirty_mult
377bd16ea49c3e36706a52ef9c8f560813c167fa085Jason Evans	    = lg_dirty_mult, lg_dirty_mult++) {
3788d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		ssize_t old_lg_dirty_mult;
3798d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
3808d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		assert_d_eq(mallctl("arena.0.lg_dirty_mult", &old_lg_dirty_mult,
3818d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		    &sz, &lg_dirty_mult, sizeof(ssize_t)), 0,
3828d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		    "Unexpected mallctl() failure");
3838d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		assert_zd_eq(old_lg_dirty_mult, prev_lg_dirty_mult,
3848d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		    "Unexpected old arena.0.lg_dirty_mult");
3858d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	}
3868d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans}
3878d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason EvansTEST_END
3888d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
389e42940346e47de63bfc47470c86c3c132ec2db8cChristopher FerrisTEST_BEGIN(test_arena_i_decay_time)
390e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris{
391e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	ssize_t decay_time, orig_decay_time, prev_decay_time;
392e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	size_t sz = sizeof(ssize_t);
393e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
394e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	test_skip_if(opt_purge != purge_mode_decay);
395e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
396e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	assert_d_eq(mallctl("arena.0.decay_time", &orig_decay_time, &sz,
397e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    NULL, 0), 0, "Unexpected mallctl() failure");
398e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
399e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	decay_time = -2;
400e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	assert_d_eq(mallctl("arena.0.decay_time", NULL, NULL,
401e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    &decay_time, sizeof(ssize_t)), EFAULT,
402e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    "Unexpected mallctl() success");
403e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
404e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	decay_time = 0x7fffffff;
405e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	assert_d_eq(mallctl("arena.0.decay_time", NULL, NULL,
406e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    &decay_time, sizeof(ssize_t)), 0,
407e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    "Unexpected mallctl() failure");
408e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
409e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	for (prev_decay_time = decay_time, decay_time = -1;
410e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    decay_time < 20; prev_decay_time = decay_time, decay_time++) {
411e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris		ssize_t old_decay_time;
412e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
413e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris		assert_d_eq(mallctl("arena.0.decay_time", &old_decay_time,
414e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris		    &sz, &decay_time, sizeof(ssize_t)), 0,
415e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris		    "Unexpected mallctl() failure");
416e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris		assert_zd_eq(old_decay_time, prev_decay_time,
417e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris		    "Unexpected old arena.0.decay_time");
418e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	}
419e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris}
420e42940346e47de63bfc47470c86c3c132ec2db8cChristopher FerrisTEST_END
421e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
422de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arena_i_purge)
423de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
424de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned narenas;
425de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(unsigned);
426de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t mib[3];
427de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t miblen = 3;
428de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
429de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
430de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
431de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
432de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.narenas", &narenas, &sz, NULL, 0), 0,
433de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
434de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlnametomib("arena.0.purge", mib, &miblen), 0,
435de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlnametomib() failure");
436de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	mib[1] = narenas;
437de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0,
438de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlbymib() failure");
439de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
440de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
441de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
442e42940346e47de63bfc47470c86c3c132ec2db8cChristopher FerrisTEST_BEGIN(test_arena_i_decay)
443e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris{
444e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	unsigned narenas;
445e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	size_t sz = sizeof(unsigned);
446e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	size_t mib[3];
447e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	size_t miblen = 3;
448e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
449e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	assert_d_eq(mallctl("arena.0.decay", NULL, NULL, NULL, 0), 0,
450e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    "Unexpected mallctl() failure");
451e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
452e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	assert_d_eq(mallctl("arenas.narenas", &narenas, &sz, NULL, 0), 0,
453e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    "Unexpected mallctl() failure");
454e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	assert_d_eq(mallctlnametomib("arena.0.decay", mib, &miblen), 0,
455e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    "Unexpected mallctlnametomib() failure");
456e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	mib[1] = narenas;
457e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0,
458e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    "Unexpected mallctlbymib() failure");
459e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris}
460e42940346e47de63bfc47470c86c3c132ec2db8cChristopher FerrisTEST_END
461e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
462de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arena_i_dss)
463de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
464de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	const char *dss_prec_old, *dss_prec_new;
465de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(dss_prec_old);
4664d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	size_t mib[3];
4674d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	size_t miblen;
4684d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans
4694d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	miblen = sizeof(mib)/sizeof(size_t);
4704d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	assert_d_eq(mallctlnametomib("arena.0.dss", mib, &miblen), 0,
4714d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	    "Unexpected mallctlnametomib() error");
472de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
4734d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	dss_prec_new = "disabled";
4744d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_old, &sz, &dss_prec_new,
475de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    sizeof(dss_prec_new)), 0, "Unexpected mallctl() failure");
476de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_str_ne(dss_prec_old, "primary",
477de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected default for dss precedence");
478de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
4794d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_new, &sz, &dss_prec_old,
480de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    sizeof(dss_prec_old)), 0, "Unexpected mallctl() failure");
4814d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans
482586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_old, &sz, NULL, 0), 0,
483586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	    "Unexpected mallctl() failure");
484586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	assert_str_ne(dss_prec_old, "primary",
485586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	    "Unexpected value for dss precedence");
486586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans
4874d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	mib[1] = narenas_total_get();
4884d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	dss_prec_new = "disabled";
4894d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_old, &sz, &dss_prec_new,
4904d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	    sizeof(dss_prec_new)), 0, "Unexpected mallctl() failure");
4914d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	assert_str_ne(dss_prec_old, "primary",
4924d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	    "Unexpected default for dss precedence");
493586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans
494586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_new, &sz, &dss_prec_old,
495586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	    sizeof(dss_prec_new)), 0, "Unexpected mallctl() failure");
496586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans
497586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_old, &sz, NULL, 0), 0,
498586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	    "Unexpected mallctl() failure");
499586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	assert_str_ne(dss_prec_old, "primary",
500586c8ede42d7d0545d36d9cbb0235fb39221ef3eJason Evans	    "Unexpected value for dss precedence");
501de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
502de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
503de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
504de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_initialized)
505de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
506de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned narenas;
507de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(narenas);
508de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
509de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.narenas", &narenas, &sz, NULL, 0), 0,
510de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
511de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	{
512f41f14366877538b03109ecf346dbff2e21bbb16Mike Hommey		VARIABLE_ARRAY(bool, initialized, narenas);
513de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
514de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		sz = narenas * sizeof(bool);
515de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		assert_d_eq(mallctl("arenas.initialized", initialized, &sz,
516de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		    NULL, 0), 0, "Unexpected mallctl() failure");
517de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	}
518de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
519de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
520de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
5218d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason EvansTEST_BEGIN(test_arenas_lg_dirty_mult)
5228d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans{
5238d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	ssize_t lg_dirty_mult, orig_lg_dirty_mult, prev_lg_dirty_mult;
5248d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	size_t sz = sizeof(ssize_t);
5258d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
526e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	test_skip_if(opt_purge != purge_mode_ratio);
527e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
5288d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	assert_d_eq(mallctl("arenas.lg_dirty_mult", &orig_lg_dirty_mult, &sz,
5298d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    NULL, 0), 0, "Unexpected mallctl() failure");
5308d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
5318d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	lg_dirty_mult = -2;
5328d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	assert_d_eq(mallctl("arenas.lg_dirty_mult", NULL, NULL,
5338d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    &lg_dirty_mult, sizeof(ssize_t)), EFAULT,
5348d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    "Unexpected mallctl() success");
5358d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
5368d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	lg_dirty_mult = (sizeof(size_t) << 3);
5378d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	assert_d_eq(mallctl("arenas.lg_dirty_mult", NULL, NULL,
5388d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    &lg_dirty_mult, sizeof(ssize_t)), EFAULT,
5398d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    "Unexpected mallctl() success");
5408d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
5418d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	for (prev_lg_dirty_mult = orig_lg_dirty_mult, lg_dirty_mult = -1;
542bd16ea49c3e36706a52ef9c8f560813c167fa085Jason Evans	    lg_dirty_mult < (ssize_t)(sizeof(size_t) << 3); prev_lg_dirty_mult =
5438d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    lg_dirty_mult, lg_dirty_mult++) {
5448d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		ssize_t old_lg_dirty_mult;
5458d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
5468d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		assert_d_eq(mallctl("arenas.lg_dirty_mult", &old_lg_dirty_mult,
5478d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		    &sz, &lg_dirty_mult, sizeof(ssize_t)), 0,
5488d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		    "Unexpected mallctl() failure");
5498d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		assert_zd_eq(old_lg_dirty_mult, prev_lg_dirty_mult,
5508d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans		    "Unexpected old arenas.lg_dirty_mult");
5518d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	}
5528d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans}
5538d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason EvansTEST_END
5548d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans
555e42940346e47de63bfc47470c86c3c132ec2db8cChristopher FerrisTEST_BEGIN(test_arenas_decay_time)
556e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris{
557e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	ssize_t decay_time, orig_decay_time, prev_decay_time;
558e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	size_t sz = sizeof(ssize_t);
559e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
560e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	test_skip_if(opt_purge != purge_mode_decay);
561e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
562e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	assert_d_eq(mallctl("arenas.decay_time", &orig_decay_time, &sz,
563e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    NULL, 0), 0, "Unexpected mallctl() failure");
564e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
565e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	decay_time = -2;
566e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	assert_d_eq(mallctl("arenas.decay_time", NULL, NULL,
567e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    &decay_time, sizeof(ssize_t)), EFAULT,
568e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    "Unexpected mallctl() success");
569e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
570e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	decay_time = 0x7fffffff;
571e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	assert_d_eq(mallctl("arenas.decay_time", NULL, NULL,
572e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    &decay_time, sizeof(ssize_t)), 0,
573e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    "Expected mallctl() failure");
574e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
575e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	for (prev_decay_time = decay_time, decay_time = -1;
576e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    decay_time < 20; prev_decay_time = decay_time, decay_time++) {
577e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris		ssize_t old_decay_time;
578e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
579e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris		assert_d_eq(mallctl("arenas.decay_time", &old_decay_time,
580e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris		    &sz, &decay_time, sizeof(ssize_t)), 0,
581e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris		    "Unexpected mallctl() failure");
582e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris		assert_zd_eq(old_decay_time, prev_decay_time,
583e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris		    "Unexpected old arenas.decay_time");
584e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	}
585e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris}
586e42940346e47de63bfc47470c86c3c132ec2db8cChristopher FerrisTEST_END
587e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris
588de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_constants)
589de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
590de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
591de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_ARENAS_CONSTANT(t, name, expected) do {			\
592de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t name;								\
593de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(t);						\
594de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas."#name, &name, &sz, NULL, 0), 0,	\
595de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");				\
596de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
597de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
598de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
599de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_CONSTANT(size_t, quantum, QUANTUM);
600de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_CONSTANT(size_t, page, PAGE);
601de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_CONSTANT(unsigned, nbins, NBINS);
6023c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	TEST_ARENAS_CONSTANT(unsigned, nlruns, nlclasses);
6033c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	TEST_ARENAS_CONSTANT(unsigned, nhchunks, nhclasses);
604de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
605de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_CONSTANT
606de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
607de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
608de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
609de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_bin_constants)
610de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
611de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
612de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_ARENAS_BIN_CONSTANT(t, name, expected) do {		\
613de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t name;								\
614de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(t);						\
615de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.bin.0."#name, &name, &sz, NULL, 0),	\
616de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    0, "Unexpected mallctl() failure");				\
617de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
618de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
619de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
620de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_BIN_CONSTANT(size_t, size, arena_bin_info[0].reg_size);
621de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_BIN_CONSTANT(uint32_t, nregs, arena_bin_info[0].nregs);
622de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_BIN_CONSTANT(size_t, run_size, arena_bin_info[0].run_size);
623de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
624de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_BIN_CONSTANT
625de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
626de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
627de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
628de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_lrun_constants)
629de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
630de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
631de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_ARENAS_LRUN_CONSTANT(t, name, expected) do {		\
632de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t name;								\
633de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(t);						\
634de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.lrun.0."#name, &name, &sz, NULL,	\
635de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    0), 0, "Unexpected mallctl() failure");			\
636de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
637de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
638de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
639fc0b3b7383373d66cfed2cd4e2faa272a6868d32Jason Evans	TEST_ARENAS_LRUN_CONSTANT(size_t, size, LARGE_MINCLASS);
640de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
641de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_LRUN_CONSTANT
642de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
643de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
644de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
6453c4d92e82a31f652a7c77ca937a02d0185085b06Jason EvansTEST_BEGIN(test_arenas_hchunk_constants)
6463c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans{
6473c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans
6483c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans#define	TEST_ARENAS_HCHUNK_CONSTANT(t, name, expected) do {		\
6493c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	t name;								\
6503c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	size_t sz = sizeof(t);						\
6513c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	assert_d_eq(mallctl("arenas.hchunk.0."#name, &name, &sz, NULL,	\
6523c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	    0), 0, "Unexpected mallctl() failure");			\
6533c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
6543c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans} while (0)
6553c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans
6563c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	TEST_ARENAS_HCHUNK_CONSTANT(size_t, size, chunksize);
6573c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans
6583c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans#undef TEST_ARENAS_HCHUNK_CONSTANT
6593c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans}
6603c4d92e82a31f652a7c77ca937a02d0185085b06Jason EvansTEST_END
6613c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans
662de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_extend)
663de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
664de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned narenas_before, arena, narenas_after;
665de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(unsigned);
666de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
667de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.narenas", &narenas_before, &sz, NULL, 0), 0,
668de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
669de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.extend", &arena, &sz, NULL, 0), 0,
670de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
671de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.narenas", &narenas_after, &sz, NULL, 0), 0,
672de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
673de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
674de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_u_eq(narenas_before+1, narenas_after,
675de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected number of arenas before versus after extension");
676de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_u_eq(arena, narenas_after-1, "Unexpected arena index");
677de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
678de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
679de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
680de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_stats_arenas)
681de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
682de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
683de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_STATS_ARENAS(t, name) do {					\
684de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t name;								\
685de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(t);						\
686de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("stats.arenas.0."#name, &name, &sz, NULL,	\
687de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    0), 0, "Unexpected mallctl() failure");			\
688de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
689de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
690de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_STATS_ARENAS(unsigned, nthreads);
691e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_STATS_ARENAS(const char *, dss);
692e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_STATS_ARENAS(ssize_t, lg_dirty_mult);
693e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	TEST_STATS_ARENAS(ssize_t, decay_time);
694de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_STATS_ARENAS(size_t, pactive);
695de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_STATS_ARENAS(size_t, pdirty);
696de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
697de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_STATS_ARENAS
698de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
699de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
700de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
701de73296d6b56abe70b08654342e136c2612d1dbdJason Evansint
702de73296d6b56abe70b08654342e136c2612d1dbdJason Evansmain(void)
703de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
704de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
705de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	return (test(
706de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctl_errors,
707de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctlnametomib_errors,
708de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctlbymib_errors,
709de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctl_read_write,
710de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctlnametomib_short_mib,
711de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctl_config,
712de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctl_opt,
713de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_manpage_example,
7141cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	    test_tcache_none,
7151cb181ed632e7573fb4eab194e4d216867222d27Jason Evans	    test_tcache,
716de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_thread_arena,
7178d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    test_arena_i_lg_dirty_mult,
718e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    test_arena_i_decay_time,
719de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arena_i_purge,
720e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    test_arena_i_decay,
721de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arena_i_dss,
722de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_initialized,
7238d6a3e8321a7767cb2ca0930b85d5d488a8cc659Jason Evans	    test_arenas_lg_dirty_mult,
724e42940346e47de63bfc47470c86c3c132ec2db8cChristopher Ferris	    test_arenas_decay_time,
725de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_constants,
726de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_bin_constants,
727de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_lrun_constants,
7283c4d92e82a31f652a7c77ca937a02d0185085b06Jason Evans	    test_arenas_hchunk_constants,
729de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_extend,
730de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_stats_arenas));
731de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
732