1*1208bc7eSAndroid Build Coastguard Worker #include "test/jemalloc_test.h"
2*1208bc7eSAndroid Build Coastguard Worker
3*1208bc7eSAndroid Build Coastguard Worker static inline void
time_func(timedelta_t * timer,uint64_t nwarmup,uint64_t niter,void (* func)(void))4*1208bc7eSAndroid Build Coastguard Worker time_func(timedelta_t *timer, uint64_t nwarmup, uint64_t niter,
5*1208bc7eSAndroid Build Coastguard Worker void (*func)(void)) {
6*1208bc7eSAndroid Build Coastguard Worker uint64_t i;
7*1208bc7eSAndroid Build Coastguard Worker
8*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < nwarmup; i++) {
9*1208bc7eSAndroid Build Coastguard Worker func();
10*1208bc7eSAndroid Build Coastguard Worker }
11*1208bc7eSAndroid Build Coastguard Worker timer_start(timer);
12*1208bc7eSAndroid Build Coastguard Worker for (i = 0; i < niter; i++) {
13*1208bc7eSAndroid Build Coastguard Worker func();
14*1208bc7eSAndroid Build Coastguard Worker }
15*1208bc7eSAndroid Build Coastguard Worker timer_stop(timer);
16*1208bc7eSAndroid Build Coastguard Worker }
17*1208bc7eSAndroid Build Coastguard Worker
18*1208bc7eSAndroid Build Coastguard Worker void
compare_funcs(uint64_t nwarmup,uint64_t niter,const char * name_a,void (* func_a),const char * name_b,void (* func_b))19*1208bc7eSAndroid Build Coastguard Worker compare_funcs(uint64_t nwarmup, uint64_t niter, const char *name_a,
20*1208bc7eSAndroid Build Coastguard Worker void (*func_a), const char *name_b, void (*func_b)) {
21*1208bc7eSAndroid Build Coastguard Worker timedelta_t timer_a, timer_b;
22*1208bc7eSAndroid Build Coastguard Worker char ratio_buf[6];
23*1208bc7eSAndroid Build Coastguard Worker void *p;
24*1208bc7eSAndroid Build Coastguard Worker
25*1208bc7eSAndroid Build Coastguard Worker p = mallocx(1, 0);
26*1208bc7eSAndroid Build Coastguard Worker if (p == NULL) {
27*1208bc7eSAndroid Build Coastguard Worker test_fail("Unexpected mallocx() failure");
28*1208bc7eSAndroid Build Coastguard Worker return;
29*1208bc7eSAndroid Build Coastguard Worker }
30*1208bc7eSAndroid Build Coastguard Worker
31*1208bc7eSAndroid Build Coastguard Worker time_func(&timer_a, nwarmup, niter, func_a);
32*1208bc7eSAndroid Build Coastguard Worker time_func(&timer_b, nwarmup, niter, func_b);
33*1208bc7eSAndroid Build Coastguard Worker
34*1208bc7eSAndroid Build Coastguard Worker timer_ratio(&timer_a, &timer_b, ratio_buf, sizeof(ratio_buf));
35*1208bc7eSAndroid Build Coastguard Worker malloc_printf("%"FMTu64" iterations, %s=%"FMTu64"us, "
36*1208bc7eSAndroid Build Coastguard Worker "%s=%"FMTu64"us, ratio=1:%s\n",
37*1208bc7eSAndroid Build Coastguard Worker niter, name_a, timer_usec(&timer_a), name_b, timer_usec(&timer_b),
38*1208bc7eSAndroid Build Coastguard Worker ratio_buf);
39*1208bc7eSAndroid Build Coastguard Worker
40*1208bc7eSAndroid Build Coastguard Worker dallocx(p, 0);
41*1208bc7eSAndroid Build Coastguard Worker }
42*1208bc7eSAndroid Build Coastguard Worker
43*1208bc7eSAndroid Build Coastguard Worker static void
malloc_free(void)44*1208bc7eSAndroid Build Coastguard Worker malloc_free(void) {
45*1208bc7eSAndroid Build Coastguard Worker /* The compiler can optimize away free(malloc(1))! */
46*1208bc7eSAndroid Build Coastguard Worker void *p = malloc(1);
47*1208bc7eSAndroid Build Coastguard Worker if (p == NULL) {
48*1208bc7eSAndroid Build Coastguard Worker test_fail("Unexpected malloc() failure");
49*1208bc7eSAndroid Build Coastguard Worker return;
50*1208bc7eSAndroid Build Coastguard Worker }
51*1208bc7eSAndroid Build Coastguard Worker free(p);
52*1208bc7eSAndroid Build Coastguard Worker }
53*1208bc7eSAndroid Build Coastguard Worker
54*1208bc7eSAndroid Build Coastguard Worker static void
mallocx_free(void)55*1208bc7eSAndroid Build Coastguard Worker mallocx_free(void) {
56*1208bc7eSAndroid Build Coastguard Worker void *p = mallocx(1, 0);
57*1208bc7eSAndroid Build Coastguard Worker if (p == NULL) {
58*1208bc7eSAndroid Build Coastguard Worker test_fail("Unexpected mallocx() failure");
59*1208bc7eSAndroid Build Coastguard Worker return;
60*1208bc7eSAndroid Build Coastguard Worker }
61*1208bc7eSAndroid Build Coastguard Worker free(p);
62*1208bc7eSAndroid Build Coastguard Worker }
63*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_malloc_vs_mallocx)64*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_malloc_vs_mallocx) {
65*1208bc7eSAndroid Build Coastguard Worker compare_funcs(10*1000*1000, 100*1000*1000, "malloc",
66*1208bc7eSAndroid Build Coastguard Worker malloc_free, "mallocx", mallocx_free);
67*1208bc7eSAndroid Build Coastguard Worker }
68*1208bc7eSAndroid Build Coastguard Worker TEST_END
69*1208bc7eSAndroid Build Coastguard Worker
70*1208bc7eSAndroid Build Coastguard Worker static void
malloc_dallocx(void)71*1208bc7eSAndroid Build Coastguard Worker malloc_dallocx(void) {
72*1208bc7eSAndroid Build Coastguard Worker void *p = malloc(1);
73*1208bc7eSAndroid Build Coastguard Worker if (p == NULL) {
74*1208bc7eSAndroid Build Coastguard Worker test_fail("Unexpected malloc() failure");
75*1208bc7eSAndroid Build Coastguard Worker return;
76*1208bc7eSAndroid Build Coastguard Worker }
77*1208bc7eSAndroid Build Coastguard Worker dallocx(p, 0);
78*1208bc7eSAndroid Build Coastguard Worker }
79*1208bc7eSAndroid Build Coastguard Worker
80*1208bc7eSAndroid Build Coastguard Worker static void
malloc_sdallocx(void)81*1208bc7eSAndroid Build Coastguard Worker malloc_sdallocx(void) {
82*1208bc7eSAndroid Build Coastguard Worker void *p = malloc(1);
83*1208bc7eSAndroid Build Coastguard Worker if (p == NULL) {
84*1208bc7eSAndroid Build Coastguard Worker test_fail("Unexpected malloc() failure");
85*1208bc7eSAndroid Build Coastguard Worker return;
86*1208bc7eSAndroid Build Coastguard Worker }
87*1208bc7eSAndroid Build Coastguard Worker sdallocx(p, 1, 0);
88*1208bc7eSAndroid Build Coastguard Worker }
89*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_free_vs_dallocx)90*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_free_vs_dallocx) {
91*1208bc7eSAndroid Build Coastguard Worker compare_funcs(10*1000*1000, 100*1000*1000, "free", malloc_free,
92*1208bc7eSAndroid Build Coastguard Worker "dallocx", malloc_dallocx);
93*1208bc7eSAndroid Build Coastguard Worker }
94*1208bc7eSAndroid Build Coastguard Worker TEST_END
95*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_dallocx_vs_sdallocx)96*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_dallocx_vs_sdallocx) {
97*1208bc7eSAndroid Build Coastguard Worker compare_funcs(10*1000*1000, 100*1000*1000, "dallocx", malloc_dallocx,
98*1208bc7eSAndroid Build Coastguard Worker "sdallocx", malloc_sdallocx);
99*1208bc7eSAndroid Build Coastguard Worker }
100*1208bc7eSAndroid Build Coastguard Worker TEST_END
101*1208bc7eSAndroid Build Coastguard Worker
102*1208bc7eSAndroid Build Coastguard Worker static void
malloc_mus_free(void)103*1208bc7eSAndroid Build Coastguard Worker malloc_mus_free(void) {
104*1208bc7eSAndroid Build Coastguard Worker void *p;
105*1208bc7eSAndroid Build Coastguard Worker
106*1208bc7eSAndroid Build Coastguard Worker p = malloc(1);
107*1208bc7eSAndroid Build Coastguard Worker if (p == NULL) {
108*1208bc7eSAndroid Build Coastguard Worker test_fail("Unexpected malloc() failure");
109*1208bc7eSAndroid Build Coastguard Worker return;
110*1208bc7eSAndroid Build Coastguard Worker }
111*1208bc7eSAndroid Build Coastguard Worker malloc_usable_size(p);
112*1208bc7eSAndroid Build Coastguard Worker free(p);
113*1208bc7eSAndroid Build Coastguard Worker }
114*1208bc7eSAndroid Build Coastguard Worker
115*1208bc7eSAndroid Build Coastguard Worker static void
malloc_sallocx_free(void)116*1208bc7eSAndroid Build Coastguard Worker malloc_sallocx_free(void) {
117*1208bc7eSAndroid Build Coastguard Worker void *p;
118*1208bc7eSAndroid Build Coastguard Worker
119*1208bc7eSAndroid Build Coastguard Worker p = malloc(1);
120*1208bc7eSAndroid Build Coastguard Worker if (p == NULL) {
121*1208bc7eSAndroid Build Coastguard Worker test_fail("Unexpected malloc() failure");
122*1208bc7eSAndroid Build Coastguard Worker return;
123*1208bc7eSAndroid Build Coastguard Worker }
124*1208bc7eSAndroid Build Coastguard Worker if (sallocx(p, 0) < 1) {
125*1208bc7eSAndroid Build Coastguard Worker test_fail("Unexpected sallocx() failure");
126*1208bc7eSAndroid Build Coastguard Worker }
127*1208bc7eSAndroid Build Coastguard Worker free(p);
128*1208bc7eSAndroid Build Coastguard Worker }
129*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_mus_vs_sallocx)130*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_mus_vs_sallocx) {
131*1208bc7eSAndroid Build Coastguard Worker compare_funcs(10*1000*1000, 100*1000*1000, "malloc_usable_size",
132*1208bc7eSAndroid Build Coastguard Worker malloc_mus_free, "sallocx", malloc_sallocx_free);
133*1208bc7eSAndroid Build Coastguard Worker }
134*1208bc7eSAndroid Build Coastguard Worker TEST_END
135*1208bc7eSAndroid Build Coastguard Worker
136*1208bc7eSAndroid Build Coastguard Worker static void
malloc_nallocx_free(void)137*1208bc7eSAndroid Build Coastguard Worker malloc_nallocx_free(void) {
138*1208bc7eSAndroid Build Coastguard Worker void *p;
139*1208bc7eSAndroid Build Coastguard Worker
140*1208bc7eSAndroid Build Coastguard Worker p = malloc(1);
141*1208bc7eSAndroid Build Coastguard Worker if (p == NULL) {
142*1208bc7eSAndroid Build Coastguard Worker test_fail("Unexpected malloc() failure");
143*1208bc7eSAndroid Build Coastguard Worker return;
144*1208bc7eSAndroid Build Coastguard Worker }
145*1208bc7eSAndroid Build Coastguard Worker if (nallocx(1, 0) < 1) {
146*1208bc7eSAndroid Build Coastguard Worker test_fail("Unexpected nallocx() failure");
147*1208bc7eSAndroid Build Coastguard Worker }
148*1208bc7eSAndroid Build Coastguard Worker free(p);
149*1208bc7eSAndroid Build Coastguard Worker }
150*1208bc7eSAndroid Build Coastguard Worker
TEST_BEGIN(test_sallocx_vs_nallocx)151*1208bc7eSAndroid Build Coastguard Worker TEST_BEGIN(test_sallocx_vs_nallocx) {
152*1208bc7eSAndroid Build Coastguard Worker compare_funcs(10*1000*1000, 100*1000*1000, "sallocx",
153*1208bc7eSAndroid Build Coastguard Worker malloc_sallocx_free, "nallocx", malloc_nallocx_free);
154*1208bc7eSAndroid Build Coastguard Worker }
155*1208bc7eSAndroid Build Coastguard Worker TEST_END
156*1208bc7eSAndroid Build Coastguard Worker
157*1208bc7eSAndroid Build Coastguard Worker int
main(void)158*1208bc7eSAndroid Build Coastguard Worker main(void) {
159*1208bc7eSAndroid Build Coastguard Worker return test_no_reentrancy(
160*1208bc7eSAndroid Build Coastguard Worker test_malloc_vs_mallocx,
161*1208bc7eSAndroid Build Coastguard Worker test_free_vs_dallocx,
162*1208bc7eSAndroid Build Coastguard Worker test_dallocx_vs_sdallocx,
163*1208bc7eSAndroid Build Coastguard Worker test_mus_vs_sallocx,
164*1208bc7eSAndroid Build Coastguard Worker test_sallocx_vs_nallocx);
165*1208bc7eSAndroid Build Coastguard Worker }
166