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
120de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_MALLCTL_CONFIG(config) do {				\
121de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	bool 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
129de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_CONFIG(debug);
130de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_CONFIG(fill);
131de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_CONFIG(lazy_lock);
132de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_CONFIG(munmap);
133de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_CONFIG(prof);
134de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_CONFIG(prof_libgcc);
135de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_CONFIG(prof_libunwind);
136de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_CONFIG(stats);
137de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_CONFIG(tcache);
138de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_CONFIG(tls);
139de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_CONFIG(utrace);
140de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_CONFIG(valgrind);
141de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_CONFIG(xmalloc);
142de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
143de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_MALLCTL_CONFIG
144de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
145de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
146de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
147de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_mallctl_opt)
148de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
149de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	bool config_always = true;
150de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
151de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_MALLCTL_OPT(t, opt, config) do {				\
152de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t oldval;							\
153de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(oldval);					\
154de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	int expected = config_##config ? 0 : ENOENT;			\
155de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	int result = mallctl("opt."#opt, &oldval, &sz, NULL, 0);	\
156de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(result, expected,					\
157de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() result for opt."#opt);		\
158de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(sz, sizeof(oldval), "Unexpected output size");	\
159de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
160de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
161de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, abort, always);
162de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(size_t, lg_chunk, always);
163de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(const char *, dss, always);
164de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(size_t, narenas, always);
165de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(ssize_t, lg_dirty_mult, always);
166de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, stats_print, always);
167de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, junk, fill);
168de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(size_t, quarantine, fill);
169de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, redzone, fill);
170de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, zero, fill);
171de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, utrace, utrace);
172de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, xmalloc, xmalloc);
173de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, tcache, tcache);
174de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(size_t, lg_tcache_max, tcache);
175de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof, prof);
176de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(const char *, prof_prefix, prof);
177de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_active, prof);
178de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(ssize_t, lg_prof_sample, prof);
179de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_accum, prof);
180de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(ssize_t, lg_prof_interval, prof);
181de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_gdump, prof);
182de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_final, prof);
183de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_MALLCTL_OPT(bool, prof_leak, prof);
184de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
185de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_MALLCTL_OPT
186de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
187de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
188de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
189de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_manpage_example)
190de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
191de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned nbins, i;
192de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t mib[4];
193de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t len, miblen;
194de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
195de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	len = sizeof(nbins);
196de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.nbins", &nbins, &len, NULL, 0), 0,
197de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
198de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
199de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	miblen = 4;
200de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlnametomib("arenas.bin.0.size", mib, &miblen), 0,
201de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlnametomib() failure");
202de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	for (i = 0; i < nbins; i++) {
203de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		size_t bin_size;
204de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
205de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		mib[2] = i;
206de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		len = sizeof(bin_size);
207de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		assert_d_eq(mallctlbymib(mib, miblen, &bin_size, &len, NULL, 0),
208de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		    0, "Unexpected mallctlbymib() failure");
209de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		/* Do something with bin_size... */
210de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	}
211de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
212de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
213de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
214de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_thread_arena)
215de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
216de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned arena_old, arena_new, narenas;
217de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(unsigned);
218de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
219de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.narenas", &narenas, &sz, NULL, 0), 0,
220de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
221de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_u_eq(narenas, opt_narenas, "Number of arenas incorrect");
222de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	arena_new = narenas - 1;
223de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("thread.arena", &arena_old, &sz, &arena_new,
224de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    sizeof(unsigned)), 0, "Unexpected mallctl() failure");
225de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	arena_new = 0;
226de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("thread.arena", &arena_old, &sz, &arena_new,
227de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    sizeof(unsigned)), 0, "Unexpected mallctl() failure");
228de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
229de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
230de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
231de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arena_i_purge)
232de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
233de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned narenas;
234de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(unsigned);
235de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t mib[3];
236de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t miblen = 3;
237de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
238de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
239de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
240de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
241de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.narenas", &narenas, &sz, NULL, 0), 0,
242de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
243de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlnametomib("arena.0.purge", mib, &miblen), 0,
244de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlnametomib() failure");
245de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	mib[1] = narenas;
246de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0,
247de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctlbymib() failure");
248de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
249de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
250de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
251de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arena_i_dss)
252de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
253de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	const char *dss_prec_old, *dss_prec_new;
254de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(dss_prec_old);
2554d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	size_t mib[3];
2564d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	size_t miblen;
2574d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans
2584d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	miblen = sizeof(mib)/sizeof(size_t);
2594d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	assert_d_eq(mallctlnametomib("arena.0.dss", mib, &miblen), 0,
2604d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	    "Unexpected mallctlnametomib() error");
261de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
2624d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	dss_prec_new = "disabled";
2634d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_old, &sz, &dss_prec_new,
264de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    sizeof(dss_prec_new)), 0, "Unexpected mallctl() failure");
265de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_str_ne(dss_prec_old, "primary",
266de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected default for dss precedence");
267de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
2684d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_new, &sz, &dss_prec_old,
269de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    sizeof(dss_prec_old)), 0, "Unexpected mallctl() failure");
2704d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans
2714d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	mib[1] = narenas_total_get();
2724d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	dss_prec_new = "disabled";
2734d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	assert_d_eq(mallctlbymib(mib, miblen, &dss_prec_old, &sz, &dss_prec_new,
2744d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	    sizeof(dss_prec_new)), 0, "Unexpected mallctl() failure");
2754d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	assert_str_ne(dss_prec_old, "primary",
2764d434adb146375ad17f0d5e994ed5728d2942e3fJason Evans	    "Unexpected default for dss precedence");
277de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
278de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
279de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
280de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_initialized)
281de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
282de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned narenas;
283de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(narenas);
284de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
285de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.narenas", &narenas, &sz, NULL, 0), 0,
286de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
287de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	{
28824feae6bd0c8c8d2cee97ab6588a92a81266a861Mike Hommey		VARIABLE_ARRAY(bool, initialized, narenas);
289de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
290de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		sz = narenas * sizeof(bool);
291de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		assert_d_eq(mallctl("arenas.initialized", initialized, &sz,
292de73296d6b56abe70b08654342e136c2612d1dbdJason Evans		    NULL, 0), 0, "Unexpected mallctl() failure");
293de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	}
294de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
295de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
296de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
297de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_constants)
298de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
299de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
300de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_ARENAS_CONSTANT(t, name, expected) do {			\
301de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t name;								\
302de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(t);						\
303de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas."#name, &name, &sz, NULL, 0), 0,	\
304de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");				\
305de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
306de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
307de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
308de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_CONSTANT(size_t, quantum, QUANTUM);
309de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_CONSTANT(size_t, page, PAGE);
310de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_CONSTANT(unsigned, nbins, NBINS);
311de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_CONSTANT(size_t, nlruns, nlclasses);
312de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
313de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_CONSTANT
314de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
315de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
316de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
317de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_bin_constants)
318de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
319de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
320de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_ARENAS_BIN_CONSTANT(t, name, expected) do {		\
321de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t name;								\
322de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(t);						\
323de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.bin.0."#name, &name, &sz, NULL, 0),	\
324de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    0, "Unexpected mallctl() failure");				\
325de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
326de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
327de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
328de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_BIN_CONSTANT(size_t, size, arena_bin_info[0].reg_size);
329de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_BIN_CONSTANT(uint32_t, nregs, arena_bin_info[0].nregs);
330de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_BIN_CONSTANT(size_t, run_size, arena_bin_info[0].run_size);
331de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
332de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_BIN_CONSTANT
333de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
334de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
335de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
336de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_lrun_constants)
337de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
338de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
339de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_ARENAS_LRUN_CONSTANT(t, name, expected) do {		\
340de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t name;								\
341de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(t);						\
342de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.lrun.0."#name, &name, &sz, NULL,	\
343de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    0), 0, "Unexpected mallctl() failure");			\
344de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_zu_eq(name, expected, "Incorrect "#name" size");		\
345de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
346de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
347de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_ARENAS_LRUN_CONSTANT(size_t, size, (1 << LG_PAGE));
348de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
349de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_ARENAS_LRUN_CONSTANT
350de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
351de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
352de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
353de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_arenas_extend)
354de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
355de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	unsigned narenas_before, arena, narenas_after;
356de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(unsigned);
357de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
358de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.narenas", &narenas_before, &sz, NULL, 0), 0,
359de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
360de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.extend", &arena, &sz, NULL, 0), 0,
361de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
362de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("arenas.narenas", &narenas_after, &sz, NULL, 0), 0,
363de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected mallctl() failure");
364de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
365de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_u_eq(narenas_before+1, narenas_after,
366de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    "Unexpected number of arenas before versus after extension");
367de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_u_eq(arena, narenas_after-1, "Unexpected arena index");
368de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
369de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
370de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
371de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_BEGIN(test_stats_arenas)
372de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
373de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
374de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#define	TEST_STATS_ARENAS(t, name) do {					\
375de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	t name;								\
376de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	size_t sz = sizeof(t);						\
377de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	assert_d_eq(mallctl("stats.arenas.0."#name, &name, &sz, NULL,	\
378de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    0), 0, "Unexpected mallctl() failure");			\
379de73296d6b56abe70b08654342e136c2612d1dbdJason Evans} while (0)
380de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
381de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_STATS_ARENAS(const char *, dss);
382de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_STATS_ARENAS(unsigned, nthreads);
383de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_STATS_ARENAS(size_t, pactive);
384de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	TEST_STATS_ARENAS(size_t, pdirty);
385de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
386de73296d6b56abe70b08654342e136c2612d1dbdJason Evans#undef TEST_STATS_ARENAS
387de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
388de73296d6b56abe70b08654342e136c2612d1dbdJason EvansTEST_END
389de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
390de73296d6b56abe70b08654342e136c2612d1dbdJason Evansint
391de73296d6b56abe70b08654342e136c2612d1dbdJason Evansmain(void)
392de73296d6b56abe70b08654342e136c2612d1dbdJason Evans{
393de73296d6b56abe70b08654342e136c2612d1dbdJason Evans
394de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	return (test(
395de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctl_errors,
396de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctlnametomib_errors,
397de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctlbymib_errors,
398de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctl_read_write,
399de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctlnametomib_short_mib,
400de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctl_config,
401de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_mallctl_opt,
402de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_manpage_example,
403de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_thread_arena,
404de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arena_i_purge,
405de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arena_i_dss,
406de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_initialized,
407de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_constants,
408de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_bin_constants,
409de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_lrun_constants,
410de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_arenas_extend,
411de73296d6b56abe70b08654342e136c2612d1dbdJason Evans	    test_stats_arenas));
412de73296d6b56abe70b08654342e136c2612d1dbdJason Evans}
413