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