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