1*1208bc7eSAndroid Build Coastguard Worker #include "test/jemalloc_test.h"
2*1208bc7eSAndroid Build Coastguard Worker
3*1208bc7eSAndroid Build Coastguard Worker static int
prof_dump_open_intercept(bool propagate_err,const char * filename)4*1208bc7eSAndroid Build Coastguard Worker prof_dump_open_intercept(bool propagate_err, const char *filename) {
5*1208bc7eSAndroid Build Coastguard Worker int fd;
6*1208bc7eSAndroid Build Coastguard Worker
7*1208bc7eSAndroid Build Coastguard Worker fd = open("/dev/null", O_WRONLY);
8*1208bc7eSAndroid Build Coastguard Worker assert_d_ne(fd, -1, "Unexpected open() failure");
9*1208bc7eSAndroid Build Coastguard Worker
10*1208bc7eSAndroid Build Coastguard Worker return fd;
11*1208bc7eSAndroid Build Coastguard Worker }
12*1208bc7eSAndroid Build Coastguard Worker
13*1208bc7eSAndroid Build Coastguard Worker static void
set_prof_active(bool active)14*1208bc7eSAndroid Build Coastguard Worker set_prof_active(bool active) {
15*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("prof.active", NULL, NULL, (void *)&active,
16*1208bc7eSAndroid Build Coastguard Worker sizeof(active)), 0, "Unexpected mallctl failure");
17*1208bc7eSAndroid Build Coastguard Worker }
18*1208bc7eSAndroid Build Coastguard Worker
19*1208bc7eSAndroid Build Coastguard Worker static size_t
get_lg_prof_sample(void)20*1208bc7eSAndroid Build Coastguard Worker get_lg_prof_sample(void) {
21*1208bc7eSAndroid Build Coastguard Worker size_t lg_prof_sample;
22*1208bc7eSAndroid Build Coastguard Worker size_t sz = sizeof(size_t);
23*1208bc7eSAndroid Build Coastguard Worker
24*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("prof.lg_sample", (void *)&lg_prof_sample, &sz,
25*1208bc7eSAndroid Build Coastguard Worker NULL, 0), 0,
26*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl failure while reading profiling sample rate");
27*1208bc7eSAndroid Build Coastguard Worker return lg_prof_sample;
28*1208bc7eSAndroid Build Coastguard Worker }
29*1208bc7eSAndroid Build Coastguard Worker
30*1208bc7eSAndroid Build Coastguard Worker static void
do_prof_reset(size_t lg_prof_sample)31*1208bc7eSAndroid Build Coastguard Worker do_prof_reset(size_t lg_prof_sample) {
32*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("prof.reset", NULL, NULL,
33*1208bc7eSAndroid Build Coastguard Worker (void *)&lg_prof_sample, sizeof(size_t)), 0,
34*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl failure while resetting profile data");
35*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(lg_prof_sample, get_lg_prof_sample(),
36*1208bc7eSAndroid Build Coastguard Worker "Expected profile sample rate change");
37*1208bc7eSAndroid Build Coastguard Worker }
38*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_prof_reset_basic)39*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_prof_reset_basic) {
40*1208bc7eSAndroid Build Coastguard Worker size_t lg_prof_sample_orig, lg_prof_sample, lg_prof_sample_next;
41*1208bc7eSAndroid Build Coastguard Worker size_t sz;
42*1208bc7eSAndroid Build Coastguard Worker unsigned i;
43*1208bc7eSAndroid Build Coastguard Worker
44*1208bc7eSAndroid Build Coastguard Worker test_skip_if(!config_prof);
45*1208bc7eSAndroid Build Coastguard Worker
46*1208bc7eSAndroid Build Coastguard Worker sz = sizeof(size_t);
47*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("opt.lg_prof_sample", (void *)&lg_prof_sample_orig,
48*1208bc7eSAndroid Build Coastguard Worker &sz, NULL, 0), 0,
49*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl failure while reading profiling sample rate");
50*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(lg_prof_sample_orig, 0,
51*1208bc7eSAndroid Build Coastguard Worker "Unexpected profiling sample rate");
52*1208bc7eSAndroid Build Coastguard Worker lg_prof_sample = get_lg_prof_sample();
53*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(lg_prof_sample_orig, lg_prof_sample,
54*1208bc7eSAndroid Build Coastguard Worker "Unexpected disagreement between \"opt.lg_prof_sample\" and "
55*1208bc7eSAndroid Build Coastguard Worker "\"prof.lg_sample\"");
56*1208bc7eSAndroid Build Coastguard Worker
57*1208bc7eSAndroid Build Coastguard Worker /* Test simple resets. */
58*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
59*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("prof.reset", NULL, NULL, NULL, 0), 0,
60*1208bc7eSAndroid Build Coastguard Worker "Unexpected mallctl failure while resetting profile data");
61*1208bc7eSAndroid Build Coastguard Worker lg_prof_sample = get_lg_prof_sample();
62*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(lg_prof_sample_orig, lg_prof_sample,
63*1208bc7eSAndroid Build Coastguard Worker "Unexpected profile sample rate change");
64*1208bc7eSAndroid Build Coastguard Worker }
65*1208bc7eSAndroid Build Coastguard Worker
66*1208bc7eSAndroid Build Coastguard Worker /* Test resets with prof.lg_sample changes. */
67*1208bc7eSAndroid Build Coastguard Worker lg_prof_sample_next = 1;
68*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
69*1208bc7eSAndroid Build Coastguard Worker do_prof_reset(lg_prof_sample_next);
70*1208bc7eSAndroid Build Coastguard Worker lg_prof_sample = get_lg_prof_sample();
71*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(lg_prof_sample, lg_prof_sample_next,
72*1208bc7eSAndroid Build Coastguard Worker "Expected profile sample rate change");
73*1208bc7eSAndroid Build Coastguard Worker lg_prof_sample_next = lg_prof_sample_orig;
74*1208bc7eSAndroid Build Coastguard Worker }
75*1208bc7eSAndroid Build Coastguard Worker
76*1208bc7eSAndroid Build Coastguard Worker /* Make sure the test code restored prof.lg_sample. */
77*1208bc7eSAndroid Build Coastguard Worker lg_prof_sample = get_lg_prof_sample();
78*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(lg_prof_sample_orig, lg_prof_sample,
79*1208bc7eSAndroid Build Coastguard Worker "Unexpected disagreement between \"opt.lg_prof_sample\" and "
80*1208bc7eSAndroid Build Coastguard Worker "\"prof.lg_sample\"");
81*1208bc7eSAndroid Build Coastguard Worker }
82*1208bc7eSAndroid Build Coastguard Worker TEST_END
83*1208bc7eSAndroid Build Coastguard Worker
84*1208bc7eSAndroid Build Coastguard Worker bool prof_dump_header_intercepted = false;
85*1208bc7eSAndroid Build Coastguard Worker prof_cnt_t cnt_all_copy = {0, 0, 0, 0};
86*1208bc7eSAndroid Build Coastguard Worker static bool
prof_dump_header_intercept(tsdn_t * tsdn,bool propagate_err,const prof_cnt_t * cnt_all)87*1208bc7eSAndroid Build Coastguard Worker prof_dump_header_intercept(tsdn_t *tsdn, bool propagate_err,
88*1208bc7eSAndroid Build Coastguard Worker const prof_cnt_t *cnt_all) {
89*1208bc7eSAndroid Build Coastguard Worker prof_dump_header_intercepted = true;
90*1208bc7eSAndroid Build Coastguard Worker memcpy(&cnt_all_copy, cnt_all, sizeof(prof_cnt_t));
91*1208bc7eSAndroid Build Coastguard Worker
92*1208bc7eSAndroid Build Coastguard Worker return false;
93*1208bc7eSAndroid Build Coastguard Worker }
94*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_prof_reset_cleanup)95*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_prof_reset_cleanup) {
96*1208bc7eSAndroid Build Coastguard Worker void *p;
97*1208bc7eSAndroid Build Coastguard Worker prof_dump_header_t *prof_dump_header_orig;
98*1208bc7eSAndroid Build Coastguard Worker
99*1208bc7eSAndroid Build Coastguard Worker test_skip_if(!config_prof);
100*1208bc7eSAndroid Build Coastguard Worker
101*1208bc7eSAndroid Build Coastguard Worker set_prof_active(true);
102*1208bc7eSAndroid Build Coastguard Worker
103*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(prof_bt_count(), 0, "Expected 0 backtraces");
104*1208bc7eSAndroid Build Coastguard Worker p = mallocx(1, 0);
105*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null(p, "Unexpected mallocx() failure");
106*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(prof_bt_count(), 1, "Expected 1 backtrace");
107*1208bc7eSAndroid Build Coastguard Worker
108*1208bc7eSAndroid Build Coastguard Worker prof_dump_header_orig = prof_dump_header;
109*1208bc7eSAndroid Build Coastguard Worker prof_dump_header = prof_dump_header_intercept;
110*1208bc7eSAndroid Build Coastguard Worker assert_false(prof_dump_header_intercepted, "Unexpected intercept");
111*1208bc7eSAndroid Build Coastguard Worker
112*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("prof.dump", NULL, NULL, NULL, 0),
113*1208bc7eSAndroid Build Coastguard Worker 0, "Unexpected error while dumping heap profile");
114*1208bc7eSAndroid Build Coastguard Worker assert_true(prof_dump_header_intercepted, "Expected intercept");
115*1208bc7eSAndroid Build Coastguard Worker assert_u64_eq(cnt_all_copy.curobjs, 1, "Expected 1 allocation");
116*1208bc7eSAndroid Build Coastguard Worker
117*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("prof.reset", NULL, NULL, NULL, 0), 0,
118*1208bc7eSAndroid Build Coastguard Worker "Unexpected error while resetting heap profile data");
119*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("prof.dump", NULL, NULL, NULL, 0),
120*1208bc7eSAndroid Build Coastguard Worker 0, "Unexpected error while dumping heap profile");
121*1208bc7eSAndroid Build Coastguard Worker assert_u64_eq(cnt_all_copy.curobjs, 0, "Expected 0 allocations");
122*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(prof_bt_count(), 1, "Expected 1 backtrace");
123*1208bc7eSAndroid Build Coastguard Worker
124*1208bc7eSAndroid Build Coastguard Worker prof_dump_header = prof_dump_header_orig;
125*1208bc7eSAndroid Build Coastguard Worker
126*1208bc7eSAndroid Build Coastguard Worker dallocx(p, 0);
127*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(prof_bt_count(), 0, "Expected 0 backtraces");
128*1208bc7eSAndroid Build Coastguard Worker
129*1208bc7eSAndroid Build Coastguard Worker set_prof_active(false);
130*1208bc7eSAndroid Build Coastguard Worker }
131*1208bc7eSAndroid Build Coastguard Worker TEST_END
132*1208bc7eSAndroid Build Coastguard Worker
133*1208bc7eSAndroid Build Coastguard Worker #define NTHREADS 4
134*1208bc7eSAndroid Build Coastguard Worker #define NALLOCS_PER_THREAD (1U << 13)
135*1208bc7eSAndroid Build Coastguard Worker #define OBJ_RING_BUF_COUNT 1531
136*1208bc7eSAndroid Build Coastguard Worker #define RESET_INTERVAL (1U << 10)
137*1208bc7eSAndroid Build Coastguard Worker #define DUMP_INTERVAL 3677
138*1208bc7eSAndroid Build Coastguard Worker static void *
thd_start(void * varg)139*1208bc7eSAndroid Build Coastguard Worker thd_start(void *varg) {
140*1208bc7eSAndroid Build Coastguard Worker unsigned thd_ind = *(unsigned *)varg;
141*1208bc7eSAndroid Build Coastguard Worker unsigned i;
142*1208bc7eSAndroid Build Coastguard Worker void *objs[OBJ_RING_BUF_COUNT];
143*1208bc7eSAndroid Build Coastguard Worker
144*1208bc7eSAndroid Build Coastguard Worker memset(objs, 0, sizeof(objs));
145*1208bc7eSAndroid Build Coastguard Worker
146*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NALLOCS_PER_THREAD; i++) {
147*1208bc7eSAndroid Build Coastguard Worker if (i % RESET_INTERVAL == 0) {
148*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("prof.reset", NULL, NULL, NULL, 0),
149*1208bc7eSAndroid Build Coastguard Worker 0, "Unexpected error while resetting heap profile "
150*1208bc7eSAndroid Build Coastguard Worker "data");
151*1208bc7eSAndroid Build Coastguard Worker }
152*1208bc7eSAndroid Build Coastguard Worker
153*1208bc7eSAndroid Build Coastguard Worker if (i % DUMP_INTERVAL == 0) {
154*1208bc7eSAndroid Build Coastguard Worker assert_d_eq(mallctl("prof.dump", NULL, NULL, NULL, 0),
155*1208bc7eSAndroid Build Coastguard Worker 0, "Unexpected error while dumping heap profile");
156*1208bc7eSAndroid Build Coastguard Worker }
157*1208bc7eSAndroid Build Coastguard Worker
158*1208bc7eSAndroid Build Coastguard Worker {
159*1208bc7eSAndroid Build Coastguard Worker void **pp = &objs[i % OBJ_RING_BUF_COUNT];
160*1208bc7eSAndroid Build Coastguard Worker if (*pp != NULL) {
161*1208bc7eSAndroid Build Coastguard Worker dallocx(*pp, 0);
162*1208bc7eSAndroid Build Coastguard Worker *pp = NULL;
163*1208bc7eSAndroid Build Coastguard Worker }
164*1208bc7eSAndroid Build Coastguard Worker *pp = btalloc(1, thd_ind*NALLOCS_PER_THREAD + i);
165*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null(*pp,
166*1208bc7eSAndroid Build Coastguard Worker "Unexpected btalloc() failure");
167*1208bc7eSAndroid Build Coastguard Worker }
168*1208bc7eSAndroid Build Coastguard Worker }
169*1208bc7eSAndroid Build Coastguard Worker
170*1208bc7eSAndroid Build Coastguard Worker /* Clean up any remaining objects. */
171*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < OBJ_RING_BUF_COUNT; i++) {
172*1208bc7eSAndroid Build Coastguard Worker void **pp = &objs[i % OBJ_RING_BUF_COUNT];
173*1208bc7eSAndroid Build Coastguard Worker if (*pp != NULL) {
174*1208bc7eSAndroid Build Coastguard Worker dallocx(*pp, 0);
175*1208bc7eSAndroid Build Coastguard Worker *pp = NULL;
176*1208bc7eSAndroid Build Coastguard Worker }
177*1208bc7eSAndroid Build Coastguard Worker }
178*1208bc7eSAndroid Build Coastguard Worker
179*1208bc7eSAndroid Build Coastguard Worker return NULL;
180*1208bc7eSAndroid Build Coastguard Worker }
181*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_prof_reset)182*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_prof_reset) {
183*1208bc7eSAndroid Build Coastguard Worker size_t lg_prof_sample_orig;
184*1208bc7eSAndroid Build Coastguard Worker thd_t thds[NTHREADS];
185*1208bc7eSAndroid Build Coastguard Worker unsigned thd_args[NTHREADS];
186*1208bc7eSAndroid Build Coastguard Worker unsigned i;
187*1208bc7eSAndroid Build Coastguard Worker size_t bt_count, tdata_count;
188*1208bc7eSAndroid Build Coastguard Worker
189*1208bc7eSAndroid Build Coastguard Worker test_skip_if(!config_prof);
190*1208bc7eSAndroid Build Coastguard Worker
191*1208bc7eSAndroid Build Coastguard Worker bt_count = prof_bt_count();
192*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(bt_count, 0,
193*1208bc7eSAndroid Build Coastguard Worker "Unexpected pre-existing tdata structures");
194*1208bc7eSAndroid Build Coastguard Worker tdata_count = prof_tdata_count();
195*1208bc7eSAndroid Build Coastguard Worker
196*1208bc7eSAndroid Build Coastguard Worker lg_prof_sample_orig = get_lg_prof_sample();
197*1208bc7eSAndroid Build Coastguard Worker do_prof_reset(5);
198*1208bc7eSAndroid Build Coastguard Worker
199*1208bc7eSAndroid Build Coastguard Worker set_prof_active(true);
200*1208bc7eSAndroid Build Coastguard Worker
201*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NTHREADS; i++) {
202*1208bc7eSAndroid Build Coastguard Worker thd_args[i] = i;
203*1208bc7eSAndroid Build Coastguard Worker thd_create(&thds[i], thd_start, (void *)&thd_args[i]);
204*1208bc7eSAndroid Build Coastguard Worker }
205*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NTHREADS; i++) {
206*1208bc7eSAndroid Build Coastguard Worker thd_join(thds[i], NULL);
207*1208bc7eSAndroid Build Coastguard Worker }
208*1208bc7eSAndroid Build Coastguard Worker
209*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(prof_bt_count(), bt_count,
210*1208bc7eSAndroid Build Coastguard Worker "Unexpected bactrace count change");
211*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(prof_tdata_count(), tdata_count,
212*1208bc7eSAndroid Build Coastguard Worker "Unexpected remaining tdata structures");
213*1208bc7eSAndroid Build Coastguard Worker
214*1208bc7eSAndroid Build Coastguard Worker set_prof_active(false);
215*1208bc7eSAndroid Build Coastguard Worker
216*1208bc7eSAndroid Build Coastguard Worker do_prof_reset(lg_prof_sample_orig);
217*1208bc7eSAndroid Build Coastguard Worker }
218*1208bc7eSAndroid Build Coastguard Worker TEST_END
219*1208bc7eSAndroid Build Coastguard Worker #undef NTHREADS
220*1208bc7eSAndroid Build Coastguard Worker #undef NALLOCS_PER_THREAD
221*1208bc7eSAndroid Build Coastguard Worker #undef OBJ_RING_BUF_COUNT
222*1208bc7eSAndroid Build Coastguard Worker #undef RESET_INTERVAL
223*1208bc7eSAndroid Build Coastguard Worker #undef DUMP_INTERVAL
224*1208bc7eSAndroid Build Coastguard Worker
225*1208bc7eSAndroid Build Coastguard Worker /* Test sampling at the same allocation site across resets. */
226*1208bc7eSAndroid Build Coastguard Worker #define NITER 10
TEST_BEGIN(test_xallocx)227*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_xallocx) {
228*1208bc7eSAndroid Build Coastguard Worker size_t lg_prof_sample_orig;
229*1208bc7eSAndroid Build Coastguard Worker unsigned i;
230*1208bc7eSAndroid Build Coastguard Worker void *ptrs[NITER];
231*1208bc7eSAndroid Build Coastguard Worker
232*1208bc7eSAndroid Build Coastguard Worker test_skip_if(!config_prof);
233*1208bc7eSAndroid Build Coastguard Worker
234*1208bc7eSAndroid Build Coastguard Worker lg_prof_sample_orig = get_lg_prof_sample();
235*1208bc7eSAndroid Build Coastguard Worker set_prof_active(true);
236*1208bc7eSAndroid Build Coastguard Worker
237*1208bc7eSAndroid Build Coastguard Worker /* Reset profiling. */
238*1208bc7eSAndroid Build Coastguard Worker do_prof_reset(0);
239*1208bc7eSAndroid Build Coastguard Worker
240*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NITER; i++) {
241*1208bc7eSAndroid Build Coastguard Worker void *p;
242*1208bc7eSAndroid Build Coastguard Worker size_t sz, nsz;
243*1208bc7eSAndroid Build Coastguard Worker
244*1208bc7eSAndroid Build Coastguard Worker /* Reset profiling. */
245*1208bc7eSAndroid Build Coastguard Worker do_prof_reset(0);
246*1208bc7eSAndroid Build Coastguard Worker
247*1208bc7eSAndroid Build Coastguard Worker /* Allocate small object (which will be promoted). */
248*1208bc7eSAndroid Build Coastguard Worker p = ptrs[i] = mallocx(1, 0);
249*1208bc7eSAndroid Build Coastguard Worker assert_ptr_not_null(p, "Unexpected mallocx() failure");
250*1208bc7eSAndroid Build Coastguard Worker
251*1208bc7eSAndroid Build Coastguard Worker /* Reset profiling. */
252*1208bc7eSAndroid Build Coastguard Worker do_prof_reset(0);
253*1208bc7eSAndroid Build Coastguard Worker
254*1208bc7eSAndroid Build Coastguard Worker /* Perform successful xallocx(). */
255*1208bc7eSAndroid Build Coastguard Worker sz = sallocx(p, 0);
256*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(xallocx(p, sz, 0, 0), sz,
257*1208bc7eSAndroid Build Coastguard Worker "Unexpected xallocx() failure");
258*1208bc7eSAndroid Build Coastguard Worker
259*1208bc7eSAndroid Build Coastguard Worker /* Perform unsuccessful xallocx(). */
260*1208bc7eSAndroid Build Coastguard Worker nsz = nallocx(sz+1, 0);
261*1208bc7eSAndroid Build Coastguard Worker assert_zu_eq(xallocx(p, nsz, 0, 0), sz,
262*1208bc7eSAndroid Build Coastguard Worker "Unexpected xallocx() success");
263*1208bc7eSAndroid Build Coastguard Worker }
264*1208bc7eSAndroid Build Coastguard Worker
265*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < NITER; i++) {
266*1208bc7eSAndroid Build Coastguard Worker /* dallocx. */
267*1208bc7eSAndroid Build Coastguard Worker dallocx(ptrs[i], 0);
268*1208bc7eSAndroid Build Coastguard Worker }
269*1208bc7eSAndroid Build Coastguard Worker
270*1208bc7eSAndroid Build Coastguard Worker set_prof_active(false);
271*1208bc7eSAndroid Build Coastguard Worker do_prof_reset(lg_prof_sample_orig);
272*1208bc7eSAndroid Build Coastguard Worker }
273*1208bc7eSAndroid Build Coastguard Worker TEST_END
274*1208bc7eSAndroid Build Coastguard Worker #undef NITER
275*1208bc7eSAndroid Build Coastguard Worker
276*1208bc7eSAndroid Build Coastguard Worker int
main(void)277*1208bc7eSAndroid Build Coastguard Worker main(void) {
278*1208bc7eSAndroid Build Coastguard Worker /* Intercept dumping prior to running any tests. */
279*1208bc7eSAndroid Build Coastguard Worker prof_dump_open = prof_dump_open_intercept;
280*1208bc7eSAndroid Build Coastguard Worker
281*1208bc7eSAndroid Build Coastguard Worker return test_no_reentrancy(
282*1208bc7eSAndroid Build Coastguard Worker test_prof_reset_basic,
283*1208bc7eSAndroid Build Coastguard Worker test_prof_reset_cleanup,
284*1208bc7eSAndroid Build Coastguard Worker test_prof_reset,
285*1208bc7eSAndroid Build Coastguard Worker test_xallocx);
286*1208bc7eSAndroid Build Coastguard Worker }
287