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