1*1208bc7eSAndroid Build Coastguard Worker #include "test/jemalloc_test.h"
2*1208bc7eSAndroid Build Coastguard Worker
3*1208bc7eSAndroid Build Coastguard Worker #include "jemalloc/internal/util.h"
4*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_mallctl_errors)5*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_mallctl_errors) {
6*1208bc7eSAndroid Build Coastguard Worker uint64_t epoch;
7*1208bc7eSAndroid Build Coastguard Worker size_t sz;
8*1208bc7eSAndroid Build Coastguard Worker
9*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("no_such_name", NULL, NULL, NULL, 0), ENOENT,
10*1208bc7eSAndroid Build Coastguard Worker "mallctl() should return ENOENT for non-existent names");
11*1208bc7eSAndroid Build Coastguard Worker
12*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("version", NULL, NULL, "0.0.0", strlen("0.0.0")),
13*1208bc7eSAndroid Build Coastguard Worker EPERM, "mallctl() should return EPERM on attempt to write "
14*1208bc7eSAndroid Build Coastguard Worker "read-only value");
15*1208bc7eSAndroid Build Coastguard Worker
16*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch,
17*1208bc7eSAndroid Build Coastguard Worker sizeof(epoch)-1), EINVAL,
18*1208bc7eSAndroid Build Coastguard Worker "mallctl() should return EINVAL for input size mismatch");
19*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&epoch,
20*1208bc7eSAndroid Build Coastguard Worker sizeof(epoch)+1), EINVAL,
21*1208bc7eSAndroid Build Coastguard Worker "mallctl() should return EINVAL for input size mismatch");
22*1208bc7eSAndroid Build Coastguard Worker
23*1208bc7eSAndroid Build Coastguard Worker sz = sizeof(epoch)-1;
24*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("epoch", (void *)&epoch, &sz, NULL, 0), EINVAL,
25*1208bc7eSAndroid Build Coastguard Worker "mallctl() should return EINVAL for output size mismatch");
26*1208bc7eSAndroid Build Coastguard Worker sz = sizeof(epoch)+1;
27*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("epoch", (void *)&epoch, &sz, NULL, 0), EINVAL,
28*1208bc7eSAndroid Build Coastguard Worker "mallctl() should return EINVAL for output size mismatch");
29*1208bc7eSAndroid Build Coastguard Worker }
30*1208bc7eSAndroid Build Coastguard Worker TEST_END
31*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_mallctlnametomib_errors)32*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_mallctlnametomib_errors) {
33*1208bc7eSAndroid Build Coastguard Worker size_t mib[1];
34*1208bc7eSAndroid Build Coastguard Worker size_t miblen;
35*1208bc7eSAndroid Build Coastguard Worker
36*1208bc7eSAndroid Build Coastguard Worker miblen = sizeof(mib)/sizeof(size_t);
37*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlnametomib("no_such_name", mib, &miblen), ENOENT,
38*1208bc7eSAndroid Build Coastguard Worker "mallctlnametomib() should return ENOENT for non-existent names");
39*1208bc7eSAndroid Build Coastguard Worker }
40*1208bc7eSAndroid Build Coastguard Worker TEST_END
41*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_mallctlbymib_errors)42*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_mallctlbymib_errors) {
43*1208bc7eSAndroid Build Coastguard Worker uint64_t epoch;
44*1208bc7eSAndroid Build Coastguard Worker size_t sz;
45*1208bc7eSAndroid Build Coastguard Worker size_t mib[1];
46*1208bc7eSAndroid Build Coastguard Worker size_t miblen;
47*1208bc7eSAndroid Build Coastguard Worker
48*1208bc7eSAndroid Build Coastguard Worker miblen = sizeof(mib)/sizeof(size_t);
49*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlnametomib("version", mib, &miblen), 0,
50*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctlnametomib() failure");
51*1208bc7eSAndroid Build Coastguard Worker
52*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, "0.0.0",
53*1208bc7eSAndroid Build Coastguard Worker strlen("0.0.0")), EPERM, "mallctl() should return EPERM on "
54*1208bc7eSAndroid Build Coastguard Worker "attempt to write read-only value");
55*1208bc7eSAndroid Build Coastguard Worker
56*1208bc7eSAndroid Build Coastguard Worker miblen = sizeof(mib)/sizeof(size_t);
57*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlnametomib("epoch", mib, &miblen), 0,
58*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctlnametomib() failure");
59*1208bc7eSAndroid Build Coastguard Worker
60*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, (void *)&epoch,
61*1208bc7eSAndroid Build Coastguard Worker sizeof(epoch)-1), EINVAL,
62*1208bc7eSAndroid Build Coastguard Worker "mallctlbymib() should return EINVAL for input size mismatch");
63*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, (void *)&epoch,
64*1208bc7eSAndroid Build Coastguard Worker sizeof(epoch)+1), EINVAL,
65*1208bc7eSAndroid Build Coastguard Worker "mallctlbymib() should return EINVAL for input size mismatch");
66*1208bc7eSAndroid Build Coastguard Worker
67*1208bc7eSAndroid Build Coastguard Worker sz = sizeof(epoch)-1;
68*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, (void *)&epoch, &sz, NULL, 0),
69*1208bc7eSAndroid Build Coastguard Worker EINVAL,
70*1208bc7eSAndroid Build Coastguard Worker "mallctlbymib() should return EINVAL for output size mismatch");
71*1208bc7eSAndroid Build Coastguard Worker sz = sizeof(epoch)+1;
72*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, (void *)&epoch, &sz, NULL, 0),
73*1208bc7eSAndroid Build Coastguard Worker EINVAL,
74*1208bc7eSAndroid Build Coastguard Worker "mallctlbymib() should return EINVAL for output size mismatch");
75*1208bc7eSAndroid Build Coastguard Worker }
76*1208bc7eSAndroid Build Coastguard Worker TEST_END
77*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_mallctl_read_write)78*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_mallctl_read_write) {
79*1208bc7eSAndroid Build Coastguard Worker uint64_t old_epoch, new_epoch;
80*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(old_epoch);
81*1208bc7eSAndroid Build Coastguard Worker
82*1208bc7eSAndroid Build Coastguard Worker /* Blind. */
83*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("epoch", NULL, NULL, NULL, 0), 0,
84*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
85*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
86*1208bc7eSAndroid Build Coastguard Worker
87*1208bc7eSAndroid Build Coastguard Worker /* Read. */
88*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("epoch", (void *)&old_epoch, &sz, NULL, 0), 0,
89*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
90*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
91*1208bc7eSAndroid Build Coastguard Worker
92*1208bc7eSAndroid Build Coastguard Worker /* Write. */
93*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("epoch", NULL, NULL, (void *)&new_epoch,
94*1208bc7eSAndroid Build Coastguard Worker sizeof(new_epoch)), 0, "Unexpected mallctl() failure");
95*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
96*1208bc7eSAndroid Build Coastguard Worker
97*1208bc7eSAndroid Build Coastguard Worker /* Read+write. */
98*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("epoch", (void *)&old_epoch, &sz,
99*1208bc7eSAndroid Build Coastguard Worker (void *)&new_epoch, sizeof(new_epoch)), 0,
100*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
101*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(sz, sizeof(old_epoch), "Unexpected output size");
102*1208bc7eSAndroid Build Coastguard Worker }
103*1208bc7eSAndroid Build Coastguard Worker TEST_END
104*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_mallctlnametomib_short_mib)105*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_mallctlnametomib_short_mib) {
106*1208bc7eSAndroid Build Coastguard Worker size_t mib[4];
107*1208bc7eSAndroid Build Coastguard Worker size_t miblen;
108*1208bc7eSAndroid Build Coastguard Worker
109*1208bc7eSAndroid Build Coastguard Worker miblen = 3;
110*1208bc7eSAndroid Build Coastguard Worker mib[3] = 42;
111*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlnametomib("arenas.bin.0.nregs", mib, &miblen), 0,
112*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctlnametomib() failure");
113*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(miblen, 3, "Unexpected mib output length");
114*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(mib[3], 42,
115*1208bc7eSAndroid Build Coastguard Worker "mallctlnametomib() wrote past the end of the input mib");
116*1208bc7eSAndroid Build Coastguard Worker }
117*1208bc7eSAndroid Build Coastguard Worker TEST_END
118*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_mallctl_config)119*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_mallctl_config) {
120*1208bc7eSAndroid Build Coastguard Worker #define TEST_MALLCTL_CONFIG(config, t) do { \
121*1208bc7eSAndroid Build Coastguard Worker t oldval; \
122*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(oldval); \
123*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("config."#config, (void *)&oldval, &sz, \
124*1208bc7eSAndroid Build Coastguard Worker NULL, 0), 0, "Unexpected mallctl() failure"); \
125*1208bc7eSAndroid Build Coastguard Worker assert_b_eq(oldval, config_##config, "Incorrect config value"); \
126*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(sz, sizeof(oldval), "Unexpected output size"); \
127*1208bc7eSAndroid Build Coastguard Worker } while (0)
128*1208bc7eSAndroid Build Coastguard Worker
129*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_CONFIG(cache_oblivious, bool);
130*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_CONFIG(debug, bool);
131*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_CONFIG(fill, bool);
132*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_CONFIG(lazy_lock, bool);
133*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_CONFIG(malloc_conf, const char *);
134*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_CONFIG(prof, bool);
135*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_CONFIG(prof_libgcc, bool);
136*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_CONFIG(prof_libunwind, bool);
137*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_CONFIG(stats, bool);
138*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_CONFIG(utrace, bool);
139*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_CONFIG(xmalloc, bool);
140*1208bc7eSAndroid Build Coastguard Worker
141*1208bc7eSAndroid Build Coastguard Worker #undef TEST_MALLCTL_CONFIG
142*1208bc7eSAndroid Build Coastguard Worker }
143*1208bc7eSAndroid Build Coastguard Worker TEST_END
144*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_mallctl_opt)145*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_mallctl_opt) {
146*1208bc7eSAndroid Build Coastguard Worker bool config_always = true;
147*1208bc7eSAndroid Build Coastguard Worker
148*1208bc7eSAndroid Build Coastguard Worker #define TEST_MALLCTL_OPT(t, opt, config) do { \
149*1208bc7eSAndroid Build Coastguard Worker t oldval; \
150*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(oldval); \
151*1208bc7eSAndroid Build Coastguard Worker int expected = config_##config ? 0 : ENOENT; \
152*1208bc7eSAndroid Build Coastguard Worker int result = mallctl("opt."#opt, (void *)&oldval, &sz, NULL, \
153*1208bc7eSAndroid Build Coastguard Worker 0); \
154*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(result, expected, \
155*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() result for opt."#opt); \
156*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(sz, sizeof(oldval), "Unexpected output size"); \
157*1208bc7eSAndroid Build Coastguard Worker } while (0)
158*1208bc7eSAndroid Build Coastguard Worker
159*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, abort, always);
160*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, abort_conf, always);
161*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(const char *, metadata_thp, always);
162*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, retain, always);
163*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(const char *, dss, always);
164*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(unsigned, narenas, always);
165*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(const char *, percpu_arena, always);
166*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, background_thread, always);
167*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(ssize_t, dirty_decay_ms, always);
168*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(ssize_t, muzzy_decay_ms, always);
169*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, stats_print, always);
170*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(const char *, junk, fill);
171*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, zero, fill);
172*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, utrace, utrace);
173*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, xmalloc, xmalloc);
174*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, tcache, always);
175*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(size_t, lg_extent_max_active_fit, always);
176*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(size_t, lg_tcache_max, always);
177*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(const char *, thp, always);
178*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, prof, prof);
179*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(const char *, prof_prefix, prof);
180*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, prof_active, prof);
181*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(ssize_t, lg_prof_sample, prof);
182*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, prof_accum, prof);
183*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(ssize_t, lg_prof_interval, prof);
184*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, prof_gdump, prof);
185*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, prof_final, prof);
186*1208bc7eSAndroid Build Coastguard Worker TEST_MALLCTL_OPT(bool, prof_leak, prof);
187*1208bc7eSAndroid Build Coastguard Worker
188*1208bc7eSAndroid Build Coastguard Worker #undef TEST_MALLCTL_OPT
189*1208bc7eSAndroid Build Coastguard Worker }
190*1208bc7eSAndroid Build Coastguard Worker TEST_END
191*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_manpage_example)192*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_manpage_example) {
193*1208bc7eSAndroid Build Coastguard Worker unsigned nbins, i;
194*1208bc7eSAndroid Build Coastguard Worker size_t mib[4];
195*1208bc7eSAndroid Build Coastguard Worker size_t len, miblen;
196*1208bc7eSAndroid Build Coastguard Worker
197*1208bc7eSAndroid Build Coastguard Worker len = sizeof(nbins);
198*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.nbins", (void *)&nbins, &len, NULL, 0), 0,
199*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
200*1208bc7eSAndroid Build Coastguard Worker
201*1208bc7eSAndroid Build Coastguard Worker miblen = 4;
202*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlnametomib("arenas.bin.0.size", mib, &miblen), 0,
203*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctlnametomib() failure");
204*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < nbins; i++) {
205*1208bc7eSAndroid Build Coastguard Worker size_t bin_size;
206*1208bc7eSAndroid Build Coastguard Worker
207*1208bc7eSAndroid Build Coastguard Worker mib[2] = i;
208*1208bc7eSAndroid Build Coastguard Worker len = sizeof(bin_size);
209*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, (void *)&bin_size, &len,
210*1208bc7eSAndroid Build Coastguard Worker NULL, 0), 0, "Unexpected mallctlbymib() failure");
211*1208bc7eSAndroid Build Coastguard Worker /* Do something with bin_size... */
212*1208bc7eSAndroid Build Coastguard Worker }
213*1208bc7eSAndroid Build Coastguard Worker }
214*1208bc7eSAndroid Build Coastguard Worker TEST_END
215*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_tcache_none)216*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_tcache_none) {
217*1208bc7eSAndroid Build Coastguard Worker test_skip_if(!opt_tcache);
218*1208bc7eSAndroid Build Coastguard Worker
219*1208bc7eSAndroid Build Coastguard Worker /* Allocate p and q. */
220*1208bc7eSAndroid Build Coastguard Worker void *p0 = mallocx(42, 0);
221*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null(p0, "Unexpected mallocx() failure");
222*1208bc7eSAndroid Build Coastguard Worker void *q = mallocx(42, 0);
223*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null(q, "Unexpected mallocx() failure");
224*1208bc7eSAndroid Build Coastguard Worker
225*1208bc7eSAndroid Build Coastguard Worker /* Deallocate p and q, but bypass the tcache for q. */
226*1208bc7eSAndroid Build Coastguard Worker dallocx(p0, 0);
227*1208bc7eSAndroid Build Coastguard Worker dallocx(q, MALLOCX_TCACHE_NONE);
228*1208bc7eSAndroid Build Coastguard Worker
229*1208bc7eSAndroid Build Coastguard Worker /* Make sure that tcache-based allocation returns p, not q. */
230*1208bc7eSAndroid Build Coastguard Worker void *p1 = mallocx(42, 0);
231*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null(p1, "Unexpected mallocx() failure");
232*1208bc7eSAndroid Build Coastguard Worker assert_ptr_eq(p0, p1, "Expected tcache to allocate cached region");
233*1208bc7eSAndroid Build Coastguard Worker
234*1208bc7eSAndroid Build Coastguard Worker /* Clean up. */
235*1208bc7eSAndroid Build Coastguard Worker dallocx(p1, MALLOCX_TCACHE_NONE);
236*1208bc7eSAndroid Build Coastguard Worker }
237*1208bc7eSAndroid Build Coastguard Worker TEST_END
238*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_tcache)239*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_tcache) {
240*1208bc7eSAndroid Build Coastguard Worker #define NTCACHES 10
241*1208bc7eSAndroid Build Coastguard Worker unsigned tis[NTCACHES];
242*1208bc7eSAndroid Build Coastguard Worker void *ps[NTCACHES];
243*1208bc7eSAndroid Build Coastguard Worker void *qs[NTCACHES];
244*1208bc7eSAndroid Build Coastguard Worker unsigned i;
245*1208bc7eSAndroid Build Coastguard Worker size_t sz, psz, qsz;
246*1208bc7eSAndroid Build Coastguard Worker
247*1208bc7eSAndroid Build Coastguard Worker psz = 42;
248*1208bc7eSAndroid Build Coastguard Worker qsz = nallocx(psz, 0) + 1;
249*1208bc7eSAndroid Build Coastguard Worker
250*1208bc7eSAndroid Build Coastguard Worker /* Create tcaches. */
251*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NTCACHES; i++) {
252*1208bc7eSAndroid Build Coastguard Worker sz = sizeof(unsigned);
253*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("tcache.create", (void *)&tis[i], &sz, NULL,
254*1208bc7eSAndroid Build Coastguard Worker 0), 0, "Unexpected mallctl() failure, i=%u", i);
255*1208bc7eSAndroid Build Coastguard Worker }
256*1208bc7eSAndroid Build Coastguard Worker
257*1208bc7eSAndroid Build Coastguard Worker /* Exercise tcache ID recycling. */
258*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NTCACHES; i++) {
259*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("tcache.destroy", NULL, NULL,
260*1208bc7eSAndroid Build Coastguard Worker (void *)&tis[i], sizeof(unsigned)), 0,
261*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure, i=%u", i);
262*1208bc7eSAndroid Build Coastguard Worker }
263*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NTCACHES; i++) {
264*1208bc7eSAndroid Build Coastguard Worker sz = sizeof(unsigned);
265*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("tcache.create", (void *)&tis[i], &sz, NULL,
266*1208bc7eSAndroid Build Coastguard Worker 0), 0, "Unexpected mallctl() failure, i=%u", i);
267*1208bc7eSAndroid Build Coastguard Worker }
268*1208bc7eSAndroid Build Coastguard Worker
269*1208bc7eSAndroid Build Coastguard Worker /* Flush empty tcaches. */
270*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NTCACHES; i++) {
271*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("tcache.flush", NULL, NULL, (void *)&tis[i],
272*1208bc7eSAndroid Build Coastguard Worker sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u",
273*1208bc7eSAndroid Build Coastguard Worker i);
274*1208bc7eSAndroid Build Coastguard Worker }
275*1208bc7eSAndroid Build Coastguard Worker
276*1208bc7eSAndroid Build Coastguard Worker /* Cache some allocations. */
277*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NTCACHES; i++) {
278*1208bc7eSAndroid Build Coastguard Worker ps[i] = mallocx(psz, MALLOCX_TCACHE(tis[i]));
279*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null(ps[i], "Unexpected mallocx() failure, i=%u",
280*1208bc7eSAndroid Build Coastguard Worker i);
281*1208bc7eSAndroid Build Coastguard Worker dallocx(ps[i], MALLOCX_TCACHE(tis[i]));
282*1208bc7eSAndroid Build Coastguard Worker
283*1208bc7eSAndroid Build Coastguard Worker qs[i] = mallocx(qsz, MALLOCX_TCACHE(tis[i]));
284*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null(qs[i], "Unexpected mallocx() failure, i=%u",
285*1208bc7eSAndroid Build Coastguard Worker i);
286*1208bc7eSAndroid Build Coastguard Worker dallocx(qs[i], MALLOCX_TCACHE(tis[i]));
287*1208bc7eSAndroid Build Coastguard Worker }
288*1208bc7eSAndroid Build Coastguard Worker
289*1208bc7eSAndroid Build Coastguard Worker /* Verify that tcaches allocate cached regions. */
290*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NTCACHES; i++) {
291*1208bc7eSAndroid Build Coastguard Worker void *p0 = ps[i];
292*1208bc7eSAndroid Build Coastguard Worker ps[i] = mallocx(psz, MALLOCX_TCACHE(tis[i]));
293*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null(ps[i], "Unexpected mallocx() failure, i=%u",
294*1208bc7eSAndroid Build Coastguard Worker i);
295*1208bc7eSAndroid Build Coastguard Worker assert_ptr_eq(ps[i], p0,
296*1208bc7eSAndroid Build Coastguard Worker "Expected mallocx() to allocate cached region, i=%u", i);
297*1208bc7eSAndroid Build Coastguard Worker }
298*1208bc7eSAndroid Build Coastguard Worker
299*1208bc7eSAndroid Build Coastguard Worker /* Verify that reallocation uses cached regions. */
300*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NTCACHES; i++) {
301*1208bc7eSAndroid Build Coastguard Worker void *q0 = qs[i];
302*1208bc7eSAndroid Build Coastguard Worker qs[i] = rallocx(ps[i], qsz, MALLOCX_TCACHE(tis[i]));
303*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null(qs[i], "Unexpected rallocx() failure, i=%u",
304*1208bc7eSAndroid Build Coastguard Worker i);
305*1208bc7eSAndroid Build Coastguard Worker assert_ptr_eq(qs[i], q0,
306*1208bc7eSAndroid Build Coastguard Worker "Expected rallocx() to allocate cached region, i=%u", i);
307*1208bc7eSAndroid Build Coastguard Worker /* Avoid undefined behavior in case of test failure. */
308*1208bc7eSAndroid Build Coastguard Worker if (qs[i] == NULL) {
309*1208bc7eSAndroid Build Coastguard Worker qs[i] = ps[i];
310*1208bc7eSAndroid Build Coastguard Worker }
311*1208bc7eSAndroid Build Coastguard Worker }
312*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NTCACHES; i++) {
313*1208bc7eSAndroid Build Coastguard Worker dallocx(qs[i], MALLOCX_TCACHE(tis[i]));
314*1208bc7eSAndroid Build Coastguard Worker }
315*1208bc7eSAndroid Build Coastguard Worker
316*1208bc7eSAndroid Build Coastguard Worker /* Flush some non-empty tcaches. */
317*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NTCACHES/2; i++) {
318*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("tcache.flush", NULL, NULL, (void *)&tis[i],
319*1208bc7eSAndroid Build Coastguard Worker sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u",
320*1208bc7eSAndroid Build Coastguard Worker i);
321*1208bc7eSAndroid Build Coastguard Worker }
322*1208bc7eSAndroid Build Coastguard Worker
323*1208bc7eSAndroid Build Coastguard Worker /* Destroy tcaches. */
324*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NTCACHES; i++) {
325*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("tcache.destroy", NULL, NULL,
326*1208bc7eSAndroid Build Coastguard Worker (void *)&tis[i], sizeof(unsigned)), 0,
327*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure, i=%u", i);
328*1208bc7eSAndroid Build Coastguard Worker }
329*1208bc7eSAndroid Build Coastguard Worker }
330*1208bc7eSAndroid Build Coastguard Worker TEST_END
331*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_thread_arena)332*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_thread_arena) {
333*1208bc7eSAndroid Build Coastguard Worker unsigned old_arena_ind, new_arena_ind, narenas;
334*1208bc7eSAndroid Build Coastguard Worker
335*1208bc7eSAndroid Build Coastguard Worker const char *opa;
336*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(opa);
337*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("opt.percpu_arena", (void *)&opa, &sz, NULL, 0), 0,
338*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
339*1208bc7eSAndroid Build Coastguard Worker
340*1208bc7eSAndroid Build Coastguard Worker sz = sizeof(unsigned);
341*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0),
342*1208bc7eSAndroid Build Coastguard Worker 0, "Unexpected mallctl() failure");
343*1208bc7eSAndroid Build Coastguard Worker assert_u_eq(narenas, opt_narenas, "Number of arenas incorrect");
344*1208bc7eSAndroid Build Coastguard Worker
345*1208bc7eSAndroid Build Coastguard Worker if (strcmp(opa, "disabled") == 0) {
346*1208bc7eSAndroid Build Coastguard Worker new_arena_ind = narenas - 1;
347*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("thread.arena", (void *)&old_arena_ind, &sz,
348*1208bc7eSAndroid Build Coastguard Worker (void *)&new_arena_ind, sizeof(unsigned)), 0,
349*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
350*1208bc7eSAndroid Build Coastguard Worker new_arena_ind = 0;
351*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("thread.arena", (void *)&old_arena_ind, &sz,
352*1208bc7eSAndroid Build Coastguard Worker (void *)&new_arena_ind, sizeof(unsigned)), 0,
353*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
354*1208bc7eSAndroid Build Coastguard Worker } else {
355*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("thread.arena", (void *)&old_arena_ind, &sz,
356*1208bc7eSAndroid Build Coastguard Worker NULL, 0), 0, "Unexpected mallctl() failure");
357*1208bc7eSAndroid Build Coastguard Worker new_arena_ind = percpu_arena_ind_limit(opt_percpu_arena) - 1;
358*1208bc7eSAndroid Build Coastguard Worker if (old_arena_ind != new_arena_ind) {
359*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("thread.arena",
360*1208bc7eSAndroid Build Coastguard Worker (void *)&old_arena_ind, &sz, (void *)&new_arena_ind,
361*1208bc7eSAndroid Build Coastguard Worker sizeof(unsigned)), EPERM, "thread.arena ctl "
362*1208bc7eSAndroid Build Coastguard Worker "should not be allowed with percpu arena");
363*1208bc7eSAndroid Build Coastguard Worker }
364*1208bc7eSAndroid Build Coastguard Worker }
365*1208bc7eSAndroid Build Coastguard Worker }
366*1208bc7eSAndroid Build Coastguard Worker TEST_END
367*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_arena_i_initialized)368*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_arena_i_initialized) {
369*1208bc7eSAndroid Build Coastguard Worker unsigned narenas, i;
370*1208bc7eSAndroid Build Coastguard Worker size_t sz;
371*1208bc7eSAndroid Build Coastguard Worker size_t mib[3];
372*1208bc7eSAndroid Build Coastguard Worker size_t miblen = sizeof(mib) / sizeof(size_t);
373*1208bc7eSAndroid Build Coastguard Worker bool initialized;
374*1208bc7eSAndroid Build Coastguard Worker
375*1208bc7eSAndroid Build Coastguard Worker sz = sizeof(narenas);
376*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0),
377*1208bc7eSAndroid Build Coastguard Worker 0, "Unexpected mallctl() failure");
378*1208bc7eSAndroid Build Coastguard Worker
379*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlnametomib("arena.0.initialized", mib, &miblen), 0,
380*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctlnametomib() failure");
381*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < narenas; i++) {
382*1208bc7eSAndroid Build Coastguard Worker mib[1] = i;
383*1208bc7eSAndroid Build Coastguard Worker sz = sizeof(initialized);
384*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, &initialized, &sz, NULL,
385*1208bc7eSAndroid Build Coastguard Worker 0), 0, "Unexpected mallctl() failure");
386*1208bc7eSAndroid Build Coastguard Worker }
387*1208bc7eSAndroid Build Coastguard Worker
388*1208bc7eSAndroid Build Coastguard Worker mib[1] = MALLCTL_ARENAS_ALL;
389*1208bc7eSAndroid Build Coastguard Worker sz = sizeof(initialized);
390*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, &initialized, &sz, NULL, 0), 0,
391*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
392*1208bc7eSAndroid Build Coastguard Worker assert_true(initialized,
393*1208bc7eSAndroid Build Coastguard Worker "Merged arena statistics should always be initialized");
394*1208bc7eSAndroid Build Coastguard Worker
395*1208bc7eSAndroid Build Coastguard Worker /* Equivalent to the above but using mallctl() directly. */
396*1208bc7eSAndroid Build Coastguard Worker sz = sizeof(initialized);
397*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl(
398*1208bc7eSAndroid Build Coastguard Worker "arena." STRINGIFY(MALLCTL_ARENAS_ALL) ".initialized",
399*1208bc7eSAndroid Build Coastguard Worker (void *)&initialized, &sz, NULL, 0), 0,
400*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
401*1208bc7eSAndroid Build Coastguard Worker assert_true(initialized,
402*1208bc7eSAndroid Build Coastguard Worker "Merged arena statistics should always be initialized");
403*1208bc7eSAndroid Build Coastguard Worker }
404*1208bc7eSAndroid Build Coastguard Worker TEST_END
405*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_arena_i_dirty_decay_ms)406*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_arena_i_dirty_decay_ms) {
407*1208bc7eSAndroid Build Coastguard Worker ssize_t dirty_decay_ms, orig_dirty_decay_ms, prev_dirty_decay_ms;
408*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(ssize_t);
409*1208bc7eSAndroid Build Coastguard Worker
410*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arena.0.dirty_decay_ms",
411*1208bc7eSAndroid Build Coastguard Worker (void *)&orig_dirty_decay_ms, &sz, NULL, 0), 0,
412*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
413*1208bc7eSAndroid Build Coastguard Worker
414*1208bc7eSAndroid Build Coastguard Worker dirty_decay_ms = -2;
415*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arena.0.dirty_decay_ms", NULL, NULL,
416*1208bc7eSAndroid Build Coastguard Worker (void *)&dirty_decay_ms, sizeof(ssize_t)), EFAULT,
417*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() success");
418*1208bc7eSAndroid Build Coastguard Worker
419*1208bc7eSAndroid Build Coastguard Worker dirty_decay_ms = 0x7fffffff;
420*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arena.0.dirty_decay_ms", NULL, NULL,
421*1208bc7eSAndroid Build Coastguard Worker (void *)&dirty_decay_ms, sizeof(ssize_t)), 0,
422*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
423*1208bc7eSAndroid Build Coastguard Worker
424*1208bc7eSAndroid Build Coastguard Worker for (prev_dirty_decay_ms = dirty_decay_ms, dirty_decay_ms = -1;
425*1208bc7eSAndroid Build Coastguard Worker dirty_decay_ms < 20; prev_dirty_decay_ms = dirty_decay_ms,
426*1208bc7eSAndroid Build Coastguard Worker dirty_decay_ms++) {
427*1208bc7eSAndroid Build Coastguard Worker ssize_t old_dirty_decay_ms;
428*1208bc7eSAndroid Build Coastguard Worker
429*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arena.0.dirty_decay_ms",
430*1208bc7eSAndroid Build Coastguard Worker (void *)&old_dirty_decay_ms, &sz, (void *)&dirty_decay_ms,
431*1208bc7eSAndroid Build Coastguard Worker sizeof(ssize_t)), 0, "Unexpected mallctl() failure");
432*1208bc7eSAndroid Build Coastguard Worker assert_zd_eq(old_dirty_decay_ms, prev_dirty_decay_ms,
433*1208bc7eSAndroid Build Coastguard Worker "Unexpected old arena.0.dirty_decay_ms");
434*1208bc7eSAndroid Build Coastguard Worker }
435*1208bc7eSAndroid Build Coastguard Worker }
436*1208bc7eSAndroid Build Coastguard Worker TEST_END
437*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_arena_i_muzzy_decay_ms)438*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_arena_i_muzzy_decay_ms) {
439*1208bc7eSAndroid Build Coastguard Worker ssize_t muzzy_decay_ms, orig_muzzy_decay_ms, prev_muzzy_decay_ms;
440*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(ssize_t);
441*1208bc7eSAndroid Build Coastguard Worker
442*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arena.0.muzzy_decay_ms",
443*1208bc7eSAndroid Build Coastguard Worker (void *)&orig_muzzy_decay_ms, &sz, NULL, 0), 0,
444*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
445*1208bc7eSAndroid Build Coastguard Worker
446*1208bc7eSAndroid Build Coastguard Worker muzzy_decay_ms = -2;
447*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arena.0.muzzy_decay_ms", NULL, NULL,
448*1208bc7eSAndroid Build Coastguard Worker (void *)&muzzy_decay_ms, sizeof(ssize_t)), EFAULT,
449*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() success");
450*1208bc7eSAndroid Build Coastguard Worker
451*1208bc7eSAndroid Build Coastguard Worker muzzy_decay_ms = 0x7fffffff;
452*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arena.0.muzzy_decay_ms", NULL, NULL,
453*1208bc7eSAndroid Build Coastguard Worker (void *)&muzzy_decay_ms, sizeof(ssize_t)), 0,
454*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
455*1208bc7eSAndroid Build Coastguard Worker
456*1208bc7eSAndroid Build Coastguard Worker for (prev_muzzy_decay_ms = muzzy_decay_ms, muzzy_decay_ms = -1;
457*1208bc7eSAndroid Build Coastguard Worker muzzy_decay_ms < 20; prev_muzzy_decay_ms = muzzy_decay_ms,
458*1208bc7eSAndroid Build Coastguard Worker muzzy_decay_ms++) {
459*1208bc7eSAndroid Build Coastguard Worker ssize_t old_muzzy_decay_ms;
460*1208bc7eSAndroid Build Coastguard Worker
461*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arena.0.muzzy_decay_ms",
462*1208bc7eSAndroid Build Coastguard Worker (void *)&old_muzzy_decay_ms, &sz, (void *)&muzzy_decay_ms,
463*1208bc7eSAndroid Build Coastguard Worker sizeof(ssize_t)), 0, "Unexpected mallctl() failure");
464*1208bc7eSAndroid Build Coastguard Worker assert_zd_eq(old_muzzy_decay_ms, prev_muzzy_decay_ms,
465*1208bc7eSAndroid Build Coastguard Worker "Unexpected old arena.0.muzzy_decay_ms");
466*1208bc7eSAndroid Build Coastguard Worker }
467*1208bc7eSAndroid Build Coastguard Worker }
468*1208bc7eSAndroid Build Coastguard Worker TEST_END
469*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_arena_i_purge)470*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_arena_i_purge) {
471*1208bc7eSAndroid Build Coastguard Worker unsigned narenas;
472*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(unsigned);
473*1208bc7eSAndroid Build Coastguard Worker size_t mib[3];
474*1208bc7eSAndroid Build Coastguard Worker size_t miblen = 3;
475*1208bc7eSAndroid Build Coastguard Worker
476*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0,
477*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
478*1208bc7eSAndroid Build Coastguard Worker
479*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0),
480*1208bc7eSAndroid Build Coastguard Worker 0, "Unexpected mallctl() failure");
481*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlnametomib("arena.0.purge", mib, &miblen), 0,
482*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctlnametomib() failure");
483*1208bc7eSAndroid Build Coastguard Worker mib[1] = narenas;
484*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0,
485*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctlbymib() failure");
486*1208bc7eSAndroid Build Coastguard Worker
487*1208bc7eSAndroid Build Coastguard Worker mib[1] = MALLCTL_ARENAS_ALL;
488*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0,
489*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctlbymib() failure");
490*1208bc7eSAndroid Build Coastguard Worker }
491*1208bc7eSAndroid Build Coastguard Worker TEST_END
492*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_arena_i_decay)493*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_arena_i_decay) {
494*1208bc7eSAndroid Build Coastguard Worker unsigned narenas;
495*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(unsigned);
496*1208bc7eSAndroid Build Coastguard Worker size_t mib[3];
497*1208bc7eSAndroid Build Coastguard Worker size_t miblen = 3;
498*1208bc7eSAndroid Build Coastguard Worker
499*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arena.0.decay", NULL, NULL, NULL, 0), 0,
500*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
501*1208bc7eSAndroid Build Coastguard Worker
502*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.narenas", (void *)&narenas, &sz, NULL, 0),
503*1208bc7eSAndroid Build Coastguard Worker 0, "Unexpected mallctl() failure");
504*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlnametomib("arena.0.decay", mib, &miblen), 0,
505*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctlnametomib() failure");
506*1208bc7eSAndroid Build Coastguard Worker mib[1] = narenas;
507*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0,
508*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctlbymib() failure");
509*1208bc7eSAndroid Build Coastguard Worker
510*1208bc7eSAndroid Build Coastguard Worker mib[1] = MALLCTL_ARENAS_ALL;
511*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, NULL, 0), 0,
512*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctlbymib() failure");
513*1208bc7eSAndroid Build Coastguard Worker }
514*1208bc7eSAndroid Build Coastguard Worker TEST_END
515*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_arena_i_dss)516*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_arena_i_dss) {
517*1208bc7eSAndroid Build Coastguard Worker const char *dss_prec_old, *dss_prec_new;
518*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(dss_prec_old);
519*1208bc7eSAndroid Build Coastguard Worker size_t mib[3];
520*1208bc7eSAndroid Build Coastguard Worker size_t miblen;
521*1208bc7eSAndroid Build Coastguard Worker
522*1208bc7eSAndroid Build Coastguard Worker miblen = sizeof(mib)/sizeof(size_t);
523*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlnametomib("arena.0.dss", mib, &miblen), 0,
524*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctlnametomib() error");
525*1208bc7eSAndroid Build Coastguard Worker
526*1208bc7eSAndroid Build Coastguard Worker dss_prec_new = "disabled";
527*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz,
528*1208bc7eSAndroid Build Coastguard Worker (void *)&dss_prec_new, sizeof(dss_prec_new)), 0,
529*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
530*1208bc7eSAndroid Build Coastguard Worker assert_str_ne(dss_prec_old, "primary",
531*1208bc7eSAndroid Build Coastguard Worker "Unexpected default for dss precedence");
532*1208bc7eSAndroid Build Coastguard Worker
533*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_new, &sz,
534*1208bc7eSAndroid Build Coastguard Worker (void *)&dss_prec_old, sizeof(dss_prec_old)), 0,
535*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
536*1208bc7eSAndroid Build Coastguard Worker
537*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz, NULL,
538*1208bc7eSAndroid Build Coastguard Worker 0), 0, "Unexpected mallctl() failure");
539*1208bc7eSAndroid Build Coastguard Worker assert_str_ne(dss_prec_old, "primary",
540*1208bc7eSAndroid Build Coastguard Worker "Unexpected value for dss precedence");
541*1208bc7eSAndroid Build Coastguard Worker
542*1208bc7eSAndroid Build Coastguard Worker mib[1] = narenas_total_get();
543*1208bc7eSAndroid Build Coastguard Worker dss_prec_new = "disabled";
544*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz,
545*1208bc7eSAndroid Build Coastguard Worker (void *)&dss_prec_new, sizeof(dss_prec_new)), 0,
546*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
547*1208bc7eSAndroid Build Coastguard Worker assert_str_ne(dss_prec_old, "primary",
548*1208bc7eSAndroid Build Coastguard Worker "Unexpected default for dss precedence");
549*1208bc7eSAndroid Build Coastguard Worker
550*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_new, &sz,
551*1208bc7eSAndroid Build Coastguard Worker (void *)&dss_prec_old, sizeof(dss_prec_new)), 0,
552*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
553*1208bc7eSAndroid Build Coastguard Worker
554*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, (void *)&dss_prec_old, &sz, NULL,
555*1208bc7eSAndroid Build Coastguard Worker 0), 0, "Unexpected mallctl() failure");
556*1208bc7eSAndroid Build Coastguard Worker assert_str_ne(dss_prec_old, "primary",
557*1208bc7eSAndroid Build Coastguard Worker "Unexpected value for dss precedence");
558*1208bc7eSAndroid Build Coastguard Worker }
559*1208bc7eSAndroid Build Coastguard Worker TEST_END
560*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_arena_i_retain_grow_limit)561*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_arena_i_retain_grow_limit) {
562*1208bc7eSAndroid Build Coastguard Worker size_t old_limit, new_limit, default_limit;
563*1208bc7eSAndroid Build Coastguard Worker size_t mib[3];
564*1208bc7eSAndroid Build Coastguard Worker size_t miblen;
565*1208bc7eSAndroid Build Coastguard Worker
566*1208bc7eSAndroid Build Coastguard Worker bool retain_enabled;
567*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(retain_enabled);
568*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("opt.retain", &retain_enabled, &sz, NULL, 0),
569*1208bc7eSAndroid Build Coastguard Worker 0, "Unexpected mallctl() failure");
570*1208bc7eSAndroid Build Coastguard Worker test_skip_if(!retain_enabled);
571*1208bc7eSAndroid Build Coastguard Worker
572*1208bc7eSAndroid Build Coastguard Worker sz = sizeof(default_limit);
573*1208bc7eSAndroid Build Coastguard Worker miblen = sizeof(mib)/sizeof(size_t);
574*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlnametomib("arena.0.retain_grow_limit", mib, &miblen),
575*1208bc7eSAndroid Build Coastguard Worker 0, "Unexpected mallctlnametomib() error");
576*1208bc7eSAndroid Build Coastguard Worker
577*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, &default_limit, &sz, NULL, 0), 0,
578*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
579*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(default_limit, sz_pind2sz(EXTENT_GROW_MAX_PIND),
580*1208bc7eSAndroid Build Coastguard Worker "Unexpected default for retain_grow_limit");
581*1208bc7eSAndroid Build Coastguard Worker
582*1208bc7eSAndroid Build Coastguard Worker new_limit = PAGE - 1;
583*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, &new_limit,
584*1208bc7eSAndroid Build Coastguard Worker sizeof(new_limit)), EFAULT, "Unexpected mallctl() success");
585*1208bc7eSAndroid Build Coastguard Worker
586*1208bc7eSAndroid Build Coastguard Worker new_limit = PAGE + 1;
587*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, &new_limit,
588*1208bc7eSAndroid Build Coastguard Worker sizeof(new_limit)), 0, "Unexpected mallctl() failure");
589*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, &old_limit, &sz, NULL, 0), 0,
590*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
591*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(old_limit, PAGE,
592*1208bc7eSAndroid Build Coastguard Worker "Unexpected value for retain_grow_limit");
593*1208bc7eSAndroid Build Coastguard Worker
594*1208bc7eSAndroid Build Coastguard Worker /* Expect grow less than psize class 10. */
595*1208bc7eSAndroid Build Coastguard Worker new_limit = sz_pind2sz(10) - 1;
596*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, &new_limit,
597*1208bc7eSAndroid Build Coastguard Worker sizeof(new_limit)), 0, "Unexpected mallctl() failure");
598*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, &old_limit, &sz, NULL, 0), 0,
599*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
600*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(old_limit, sz_pind2sz(9),
601*1208bc7eSAndroid Build Coastguard Worker "Unexpected value for retain_grow_limit");
602*1208bc7eSAndroid Build Coastguard Worker
603*1208bc7eSAndroid Build Coastguard Worker /* Restore to default. */
604*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctlbymib(mib, miblen, NULL, NULL, &default_limit,
605*1208bc7eSAndroid Build Coastguard Worker sizeof(default_limit)), 0, "Unexpected mallctl() failure");
606*1208bc7eSAndroid Build Coastguard Worker }
607*1208bc7eSAndroid Build Coastguard Worker TEST_END
608*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_arenas_dirty_decay_ms)609*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_arenas_dirty_decay_ms) {
610*1208bc7eSAndroid Build Coastguard Worker ssize_t dirty_decay_ms, orig_dirty_decay_ms, prev_dirty_decay_ms;
611*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(ssize_t);
612*1208bc7eSAndroid Build Coastguard Worker
613*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.dirty_decay_ms",
614*1208bc7eSAndroid Build Coastguard Worker (void *)&orig_dirty_decay_ms, &sz, NULL, 0), 0,
615*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
616*1208bc7eSAndroid Build Coastguard Worker
617*1208bc7eSAndroid Build Coastguard Worker dirty_decay_ms = -2;
618*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.dirty_decay_ms", NULL, NULL,
619*1208bc7eSAndroid Build Coastguard Worker (void *)&dirty_decay_ms, sizeof(ssize_t)), EFAULT,
620*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() success");
621*1208bc7eSAndroid Build Coastguard Worker
622*1208bc7eSAndroid Build Coastguard Worker dirty_decay_ms = 0x7fffffff;
623*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.dirty_decay_ms", NULL, NULL,
624*1208bc7eSAndroid Build Coastguard Worker (void *)&dirty_decay_ms, sizeof(ssize_t)), 0,
625*1208bc7eSAndroid Build Coastguard Worker "Expected mallctl() failure");
626*1208bc7eSAndroid Build Coastguard Worker
627*1208bc7eSAndroid Build Coastguard Worker for (prev_dirty_decay_ms = dirty_decay_ms, dirty_decay_ms = -1;
628*1208bc7eSAndroid Build Coastguard Worker dirty_decay_ms < 20; prev_dirty_decay_ms = dirty_decay_ms,
629*1208bc7eSAndroid Build Coastguard Worker dirty_decay_ms++) {
630*1208bc7eSAndroid Build Coastguard Worker ssize_t old_dirty_decay_ms;
631*1208bc7eSAndroid Build Coastguard Worker
632*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.dirty_decay_ms",
633*1208bc7eSAndroid Build Coastguard Worker (void *)&old_dirty_decay_ms, &sz, (void *)&dirty_decay_ms,
634*1208bc7eSAndroid Build Coastguard Worker sizeof(ssize_t)), 0, "Unexpected mallctl() failure");
635*1208bc7eSAndroid Build Coastguard Worker assert_zd_eq(old_dirty_decay_ms, prev_dirty_decay_ms,
636*1208bc7eSAndroid Build Coastguard Worker "Unexpected old arenas.dirty_decay_ms");
637*1208bc7eSAndroid Build Coastguard Worker }
638*1208bc7eSAndroid Build Coastguard Worker }
639*1208bc7eSAndroid Build Coastguard Worker TEST_END
640*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_arenas_muzzy_decay_ms)641*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_arenas_muzzy_decay_ms) {
642*1208bc7eSAndroid Build Coastguard Worker ssize_t muzzy_decay_ms, orig_muzzy_decay_ms, prev_muzzy_decay_ms;
643*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(ssize_t);
644*1208bc7eSAndroid Build Coastguard Worker
645*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.muzzy_decay_ms",
646*1208bc7eSAndroid Build Coastguard Worker (void *)&orig_muzzy_decay_ms, &sz, NULL, 0), 0,
647*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
648*1208bc7eSAndroid Build Coastguard Worker
649*1208bc7eSAndroid Build Coastguard Worker muzzy_decay_ms = -2;
650*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.muzzy_decay_ms", NULL, NULL,
651*1208bc7eSAndroid Build Coastguard Worker (void *)&muzzy_decay_ms, sizeof(ssize_t)), EFAULT,
652*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() success");
653*1208bc7eSAndroid Build Coastguard Worker
654*1208bc7eSAndroid Build Coastguard Worker muzzy_decay_ms = 0x7fffffff;
655*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.muzzy_decay_ms", NULL, NULL,
656*1208bc7eSAndroid Build Coastguard Worker (void *)&muzzy_decay_ms, sizeof(ssize_t)), 0,
657*1208bc7eSAndroid Build Coastguard Worker "Expected mallctl() failure");
658*1208bc7eSAndroid Build Coastguard Worker
659*1208bc7eSAndroid Build Coastguard Worker for (prev_muzzy_decay_ms = muzzy_decay_ms, muzzy_decay_ms = -1;
660*1208bc7eSAndroid Build Coastguard Worker muzzy_decay_ms < 20; prev_muzzy_decay_ms = muzzy_decay_ms,
661*1208bc7eSAndroid Build Coastguard Worker muzzy_decay_ms++) {
662*1208bc7eSAndroid Build Coastguard Worker ssize_t old_muzzy_decay_ms;
663*1208bc7eSAndroid Build Coastguard Worker
664*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.muzzy_decay_ms",
665*1208bc7eSAndroid Build Coastguard Worker (void *)&old_muzzy_decay_ms, &sz, (void *)&muzzy_decay_ms,
666*1208bc7eSAndroid Build Coastguard Worker sizeof(ssize_t)), 0, "Unexpected mallctl() failure");
667*1208bc7eSAndroid Build Coastguard Worker assert_zd_eq(old_muzzy_decay_ms, prev_muzzy_decay_ms,
668*1208bc7eSAndroid Build Coastguard Worker "Unexpected old arenas.muzzy_decay_ms");
669*1208bc7eSAndroid Build Coastguard Worker }
670*1208bc7eSAndroid Build Coastguard Worker }
671*1208bc7eSAndroid Build Coastguard Worker TEST_END
672*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_arenas_constants)673*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_arenas_constants) {
674*1208bc7eSAndroid Build Coastguard Worker #define TEST_ARENAS_CONSTANT(t, name, expected) do { \
675*1208bc7eSAndroid Build Coastguard Worker t name; \
676*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(t); \
677*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas."#name, (void *)&name, &sz, NULL, \
678*1208bc7eSAndroid Build Coastguard Worker 0), 0, "Unexpected mallctl() failure"); \
679*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(name, expected, "Incorrect "#name" size"); \
680*1208bc7eSAndroid Build Coastguard Worker } while (0)
681*1208bc7eSAndroid Build Coastguard Worker
682*1208bc7eSAndroid Build Coastguard Worker TEST_ARENAS_CONSTANT(size_t, quantum, QUANTUM);
683*1208bc7eSAndroid Build Coastguard Worker TEST_ARENAS_CONSTANT(size_t, page, PAGE);
684*1208bc7eSAndroid Build Coastguard Worker TEST_ARENAS_CONSTANT(unsigned, nbins, NBINS);
685*1208bc7eSAndroid Build Coastguard Worker TEST_ARENAS_CONSTANT(unsigned, nlextents, NSIZES - NBINS);
686*1208bc7eSAndroid Build Coastguard Worker
687*1208bc7eSAndroid Build Coastguard Worker #undef TEST_ARENAS_CONSTANT
688*1208bc7eSAndroid Build Coastguard Worker }
689*1208bc7eSAndroid Build Coastguard Worker TEST_END
690*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_arenas_bin_constants)691*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_arenas_bin_constants) {
692*1208bc7eSAndroid Build Coastguard Worker #define TEST_ARENAS_BIN_CONSTANT(t, name, expected) do { \
693*1208bc7eSAndroid Build Coastguard Worker t name; \
694*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(t); \
695*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.bin.0."#name, (void *)&name, &sz, \
696*1208bc7eSAndroid Build Coastguard Worker NULL, 0), 0, "Unexpected mallctl() failure"); \
697*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(name, expected, "Incorrect "#name" size"); \
698*1208bc7eSAndroid Build Coastguard Worker } while (0)
699*1208bc7eSAndroid Build Coastguard Worker
700*1208bc7eSAndroid Build Coastguard Worker TEST_ARENAS_BIN_CONSTANT(size_t, size, bin_infos[0].reg_size);
701*1208bc7eSAndroid Build Coastguard Worker TEST_ARENAS_BIN_CONSTANT(uint32_t, nregs, bin_infos[0].nregs);
702*1208bc7eSAndroid Build Coastguard Worker TEST_ARENAS_BIN_CONSTANT(size_t, slab_size,
703*1208bc7eSAndroid Build Coastguard Worker bin_infos[0].slab_size);
704*1208bc7eSAndroid Build Coastguard Worker
705*1208bc7eSAndroid Build Coastguard Worker #undef TEST_ARENAS_BIN_CONSTANT
706*1208bc7eSAndroid Build Coastguard Worker }
707*1208bc7eSAndroid Build Coastguard Worker TEST_END
708*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_arenas_lextent_constants)709*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_arenas_lextent_constants) {
710*1208bc7eSAndroid Build Coastguard Worker #define TEST_ARENAS_LEXTENT_CONSTANT(t, name, expected) do { \
711*1208bc7eSAndroid Build Coastguard Worker t name; \
712*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(t); \
713*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.lextent.0."#name, (void *)&name, \
714*1208bc7eSAndroid Build Coastguard Worker &sz, NULL, 0), 0, "Unexpected mallctl() failure"); \
715*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(name, expected, "Incorrect "#name" size"); \
716*1208bc7eSAndroid Build Coastguard Worker } while (0)
717*1208bc7eSAndroid Build Coastguard Worker
718*1208bc7eSAndroid Build Coastguard Worker TEST_ARENAS_LEXTENT_CONSTANT(size_t, size, LARGE_MINCLASS);
719*1208bc7eSAndroid Build Coastguard Worker
720*1208bc7eSAndroid Build Coastguard Worker #undef TEST_ARENAS_LEXTENT_CONSTANT
721*1208bc7eSAndroid Build Coastguard Worker }
722*1208bc7eSAndroid Build Coastguard Worker TEST_END
723*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_arenas_create)724*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_arenas_create) {
725*1208bc7eSAndroid Build Coastguard Worker unsigned narenas_before, arena, narenas_after;
726*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(unsigned);
727*1208bc7eSAndroid Build Coastguard Worker
728*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.narenas", (void *)&narenas_before, &sz,
729*1208bc7eSAndroid Build Coastguard Worker NULL, 0), 0, "Unexpected mallctl() failure");
730*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.create", (void *)&arena, &sz, NULL, 0), 0,
731*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
732*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.narenas", (void *)&narenas_after, &sz, NULL,
733*1208bc7eSAndroid Build Coastguard Worker 0), 0, "Unexpected mallctl() failure");
734*1208bc7eSAndroid Build Coastguard Worker
735*1208bc7eSAndroid Build Coastguard Worker assert_u_eq(narenas_before+1, narenas_after,
736*1208bc7eSAndroid Build Coastguard Worker "Unexpected number of arenas before versus after extension");
737*1208bc7eSAndroid Build Coastguard Worker assert_u_eq(arena, narenas_after-1, "Unexpected arena index");
738*1208bc7eSAndroid Build Coastguard Worker }
739*1208bc7eSAndroid Build Coastguard Worker TEST_END
740*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_arenas_lookup)741*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_arenas_lookup) {
742*1208bc7eSAndroid Build Coastguard Worker unsigned arena, arena1;
743*1208bc7eSAndroid Build Coastguard Worker void *ptr;
744*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(unsigned);
745*1208bc7eSAndroid Build Coastguard Worker
746*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.create", (void *)&arena, &sz, NULL, 0), 0,
747*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl() failure");
748*1208bc7eSAndroid Build Coastguard Worker ptr = mallocx(42, MALLOCX_ARENA(arena) | MALLOCX_TCACHE_NONE);
749*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null(ptr, "Unexpected mallocx() failure");
750*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("arenas.lookup", &arena1, &sz, &ptr, sizeof(ptr)),
751*1208bc7eSAndroid Build Coastguard Worker 0, "Unexpected mallctl() failure");
752*1208bc7eSAndroid Build Coastguard Worker assert_u_eq(arena, arena1, "Unexpected arena index");
753*1208bc7eSAndroid Build Coastguard Worker dallocx(ptr, 0);
754*1208bc7eSAndroid Build Coastguard Worker }
755*1208bc7eSAndroid Build Coastguard Worker TEST_END
756*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_stats_arenas)757*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_stats_arenas) {
758*1208bc7eSAndroid Build Coastguard Worker #define TEST_STATS_ARENAS(t, name) do { \
759*1208bc7eSAndroid Build Coastguard Worker t name; \
760*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(t); \
761*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("stats.arenas.0."#name, (void *)&name, &sz, \
762*1208bc7eSAndroid Build Coastguard Worker NULL, 0), 0, "Unexpected mallctl() failure"); \
763*1208bc7eSAndroid Build Coastguard Worker } while (0)
764*1208bc7eSAndroid Build Coastguard Worker
765*1208bc7eSAndroid Build Coastguard Worker TEST_STATS_ARENAS(unsigned, nthreads);
766*1208bc7eSAndroid Build Coastguard Worker TEST_STATS_ARENAS(const char *, dss);
767*1208bc7eSAndroid Build Coastguard Worker TEST_STATS_ARENAS(ssize_t, dirty_decay_ms);
768*1208bc7eSAndroid Build Coastguard Worker TEST_STATS_ARENAS(ssize_t, muzzy_decay_ms);
769*1208bc7eSAndroid Build Coastguard Worker TEST_STATS_ARENAS(size_t, pactive);
770*1208bc7eSAndroid Build Coastguard Worker TEST_STATS_ARENAS(size_t, pdirty);
771*1208bc7eSAndroid Build Coastguard Worker
772*1208bc7eSAndroid Build Coastguard Worker #undef TEST_STATS_ARENAS
773*1208bc7eSAndroid Build Coastguard Worker }
774*1208bc7eSAndroid Build Coastguard Worker TEST_END
775*1208bc7eSAndroid Build Coastguard Worker
776*1208bc7eSAndroid Build Coastguard Worker int
main(void)777*1208bc7eSAndroid Build Coastguard Worker main(void) {
778*1208bc7eSAndroid Build Coastguard Worker return test(
779*1208bc7eSAndroid Build Coastguard Worker test_mallctl_errors,
780*1208bc7eSAndroid Build Coastguard Worker test_mallctlnametomib_errors,
781*1208bc7eSAndroid Build Coastguard Worker test_mallctlbymib_errors,
782*1208bc7eSAndroid Build Coastguard Worker test_mallctl_read_write,
783*1208bc7eSAndroid Build Coastguard Worker test_mallctlnametomib_short_mib,
784*1208bc7eSAndroid Build Coastguard Worker test_mallctl_config,
785*1208bc7eSAndroid Build Coastguard Worker test_mallctl_opt,
786*1208bc7eSAndroid Build Coastguard Worker test_manpage_example,
787*1208bc7eSAndroid Build Coastguard Worker test_tcache_none,
788*1208bc7eSAndroid Build Coastguard Worker test_tcache,
789*1208bc7eSAndroid Build Coastguard Worker test_thread_arena,
790*1208bc7eSAndroid Build Coastguard Worker test_arena_i_initialized,
791*1208bc7eSAndroid Build Coastguard Worker test_arena_i_dirty_decay_ms,
792*1208bc7eSAndroid Build Coastguard Worker test_arena_i_muzzy_decay_ms,
793*1208bc7eSAndroid Build Coastguard Worker test_arena_i_purge,
794*1208bc7eSAndroid Build Coastguard Worker test_arena_i_decay,
795*1208bc7eSAndroid Build Coastguard Worker test_arena_i_dss,
796*1208bc7eSAndroid Build Coastguard Worker test_arena_i_retain_grow_limit,
797*1208bc7eSAndroid Build Coastguard Worker test_arenas_dirty_decay_ms,
798*1208bc7eSAndroid Build Coastguard Worker test_arenas_muzzy_decay_ms,
799*1208bc7eSAndroid Build Coastguard Worker test_arenas_constants,
800*1208bc7eSAndroid Build Coastguard Worker test_arenas_bin_constants,
801*1208bc7eSAndroid Build Coastguard Worker test_arenas_lextent_constants,
802*1208bc7eSAndroid Build Coastguard Worker test_arenas_create,
803*1208bc7eSAndroid Build Coastguard Worker test_arenas_lookup,
804*1208bc7eSAndroid Build Coastguard Worker test_stats_arenas);
805*1208bc7eSAndroid Build Coastguard Worker }
806