1 #include "test/jemalloc_test.h" 2 3 TEST_BEGIN(test_stats_summary) 4 { 5 size_t *cactive; 6 size_t sz, allocated, active, mapped; 7 int expected = config_stats ? 0 : ENOENT; 8 9 sz = sizeof(cactive); 10 assert_d_eq(mallctl("stats.cactive", &cactive, &sz, NULL, 0), expected, 11 "Unexpected mallctl() result"); 12 13 sz = sizeof(size_t); 14 assert_d_eq(mallctl("stats.allocated", &allocated, &sz, NULL, 0), 15 expected, "Unexpected mallctl() result"); 16 assert_d_eq(mallctl("stats.active", &active, &sz, NULL, 0), expected, 17 "Unexpected mallctl() result"); 18 assert_d_eq(mallctl("stats.mapped", &mapped, &sz, NULL, 0), expected, 19 "Unexpected mallctl() result"); 20 21 if (config_stats) { 22 assert_zu_le(active, *cactive, 23 "active should be no larger than cactive"); 24 assert_zu_le(allocated, active, 25 "allocated should be no larger than active"); 26 assert_zu_le(active, mapped, 27 "active should be no larger than mapped"); 28 } 29 } 30 TEST_END 31 32 TEST_BEGIN(test_stats_chunks) 33 { 34 size_t current, high; 35 uint64_t total; 36 size_t sz; 37 int expected = config_stats ? 0 : ENOENT; 38 39 sz = sizeof(size_t); 40 assert_d_eq(mallctl("stats.chunks.current", ¤t, &sz, NULL, 0), 41 expected, "Unexpected mallctl() result"); 42 sz = sizeof(uint64_t); 43 assert_d_eq(mallctl("stats.chunks.total", &total, &sz, NULL, 0), 44 expected, "Unexpected mallctl() result"); 45 sz = sizeof(size_t); 46 assert_d_eq(mallctl("stats.chunks.high", &high, &sz, NULL, 0), expected, 47 "Unexpected mallctl() result"); 48 49 if (config_stats) { 50 assert_zu_le(current, high, 51 "current should be no larger than high"); 52 assert_u64_le((uint64_t)high, total, 53 "high should be no larger than total"); 54 } 55 } 56 TEST_END 57 58 TEST_BEGIN(test_stats_huge) 59 { 60 void *p; 61 uint64_t epoch; 62 size_t allocated; 63 uint64_t nmalloc, ndalloc; 64 size_t sz; 65 int expected = config_stats ? 0 : ENOENT; 66 67 p = mallocx(arena_maxclass+1, 0); 68 assert_ptr_not_null(p, "Unexpected mallocx() failure"); 69 70 assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0, 71 "Unexpected mallctl() failure"); 72 73 sz = sizeof(size_t); 74 assert_d_eq(mallctl("stats.huge.allocated", &allocated, &sz, NULL, 0), 75 expected, "Unexpected mallctl() result"); 76 sz = sizeof(uint64_t); 77 assert_d_eq(mallctl("stats.huge.nmalloc", &nmalloc, &sz, NULL, 0), 78 expected, "Unexpected mallctl() result"); 79 assert_d_eq(mallctl("stats.huge.ndalloc", &ndalloc, &sz, NULL, 0), 80 expected, "Unexpected mallctl() result"); 81 82 if (config_stats) { 83 assert_zu_gt(allocated, 0, 84 "allocated should be greater than zero"); 85 assert_u64_ge(nmalloc, ndalloc, 86 "nmalloc should be at least as large as ndalloc"); 87 } 88 89 dallocx(p, 0); 90 } 91 TEST_END 92 93 TEST_BEGIN(test_stats_arenas_summary) 94 { 95 unsigned arena; 96 void *small, *large; 97 uint64_t epoch; 98 size_t sz; 99 int expected = config_stats ? 0 : ENOENT; 100 size_t mapped; 101 uint64_t npurge, nmadvise, purged; 102 103 arena = 0; 104 assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)), 105 0, "Unexpected mallctl() failure"); 106 107 small = mallocx(SMALL_MAXCLASS, 0); 108 assert_ptr_not_null(small, "Unexpected mallocx() failure"); 109 large = mallocx(arena_maxclass, 0); 110 assert_ptr_not_null(large, "Unexpected mallocx() failure"); 111 112 assert_d_eq(mallctl("arena.0.purge", NULL, NULL, NULL, 0), 0, 113 "Unexpected mallctl() failure"); 114 115 assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0, 116 "Unexpected mallctl() failure"); 117 118 sz = sizeof(size_t); 119 assert_d_eq(mallctl("stats.arenas.0.mapped", &mapped, &sz, NULL, 0), 120 expected, "Unexepected mallctl() result"); 121 sz = sizeof(uint64_t); 122 assert_d_eq(mallctl("stats.arenas.0.npurge", &npurge, &sz, NULL, 0), 123 expected, "Unexepected mallctl() result"); 124 assert_d_eq(mallctl("stats.arenas.0.nmadvise", &nmadvise, &sz, NULL, 0), 125 expected, "Unexepected mallctl() result"); 126 assert_d_eq(mallctl("stats.arenas.0.purged", &purged, &sz, NULL, 0), 127 expected, "Unexepected mallctl() result"); 128 129 if (config_stats) { 130 assert_u64_gt(npurge, 0, 131 "At least one purge should have occurred"); 132 assert_u64_le(nmadvise, purged, 133 "nmadvise should be no greater than purged"); 134 } 135 136 dallocx(small, 0); 137 dallocx(large, 0); 138 } 139 TEST_END 140 141 void * 142 thd_start(void *arg) 143 { 144 145 return (NULL); 146 } 147 148 static void 149 no_lazy_lock(void) 150 { 151 thd_t thd; 152 153 thd_create(&thd, thd_start, NULL); 154 thd_join(thd, NULL); 155 } 156 157 TEST_BEGIN(test_stats_arenas_small) 158 { 159 unsigned arena; 160 void *p; 161 size_t sz, allocated; 162 uint64_t epoch, nmalloc, ndalloc, nrequests; 163 int expected = config_stats ? 0 : ENOENT; 164 165 no_lazy_lock(); /* Lazy locking would dodge tcache testing. */ 166 167 arena = 0; 168 assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)), 169 0, "Unexpected mallctl() failure"); 170 171 p = mallocx(SMALL_MAXCLASS, 0); 172 assert_ptr_not_null(p, "Unexpected mallocx() failure"); 173 174 assert_d_eq(mallctl("thread.tcache.flush", NULL, NULL, NULL, 0), 175 config_tcache ? 0 : ENOENT, "Unexpected mallctl() result"); 176 177 assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0, 178 "Unexpected mallctl() failure"); 179 180 sz = sizeof(size_t); 181 assert_d_eq(mallctl("stats.arenas.0.small.allocated", &allocated, &sz, 182 NULL, 0), expected, "Unexpected mallctl() result"); 183 sz = sizeof(uint64_t); 184 assert_d_eq(mallctl("stats.arenas.0.small.nmalloc", &nmalloc, &sz, 185 NULL, 0), expected, "Unexpected mallctl() result"); 186 assert_d_eq(mallctl("stats.arenas.0.small.ndalloc", &ndalloc, &sz, 187 NULL, 0), expected, "Unexpected mallctl() result"); 188 assert_d_eq(mallctl("stats.arenas.0.small.nrequests", &nrequests, &sz, 189 NULL, 0), expected, "Unexpected mallctl() result"); 190 191 if (config_stats) { 192 assert_zu_gt(allocated, 0, 193 "allocated should be greater than zero"); 194 assert_u64_gt(nmalloc, 0, 195 "nmalloc should be no greater than zero"); 196 assert_u64_ge(nmalloc, ndalloc, 197 "nmalloc should be at least as large as ndalloc"); 198 assert_u64_gt(nrequests, 0, 199 "nrequests should be greater than zero"); 200 } 201 202 dallocx(p, 0); 203 } 204 TEST_END 205 206 TEST_BEGIN(test_stats_arenas_large) 207 { 208 unsigned arena; 209 void *p; 210 size_t sz, allocated; 211 uint64_t epoch, nmalloc, ndalloc, nrequests; 212 int expected = config_stats ? 0 : ENOENT; 213 214 arena = 0; 215 assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)), 216 0, "Unexpected mallctl() failure"); 217 218 p = mallocx(arena_maxclass, 0); 219 assert_ptr_not_null(p, "Unexpected mallocx() failure"); 220 221 assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0, 222 "Unexpected mallctl() failure"); 223 224 sz = sizeof(size_t); 225 assert_d_eq(mallctl("stats.arenas.0.large.allocated", &allocated, &sz, 226 NULL, 0), expected, "Unexpected mallctl() result"); 227 sz = sizeof(uint64_t); 228 assert_d_eq(mallctl("stats.arenas.0.large.nmalloc", &nmalloc, &sz, 229 NULL, 0), expected, "Unexpected mallctl() result"); 230 assert_d_eq(mallctl("stats.arenas.0.large.ndalloc", &ndalloc, &sz, 231 NULL, 0), expected, "Unexpected mallctl() result"); 232 assert_d_eq(mallctl("stats.arenas.0.large.nrequests", &nrequests, &sz, 233 NULL, 0), expected, "Unexpected mallctl() result"); 234 235 if (config_stats) { 236 assert_zu_gt(allocated, 0, 237 "allocated should be greater than zero"); 238 assert_zu_gt(nmalloc, 0, 239 "nmalloc should be greater than zero"); 240 assert_zu_ge(nmalloc, ndalloc, 241 "nmalloc should be at least as large as ndalloc"); 242 assert_zu_gt(nrequests, 0, 243 "nrequests should be greater than zero"); 244 } 245 246 dallocx(p, 0); 247 } 248 TEST_END 249 250 TEST_BEGIN(test_stats_arenas_bins) 251 { 252 unsigned arena; 253 void *p; 254 size_t sz, allocated, curruns; 255 uint64_t epoch, nmalloc, ndalloc, nrequests, nfills, nflushes; 256 uint64_t nruns, nreruns; 257 int expected = config_stats ? 0 : ENOENT; 258 259 arena = 0; 260 assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)), 261 0, "Unexpected mallctl() failure"); 262 263 p = mallocx(arena_bin_info[0].reg_size, 0); 264 assert_ptr_not_null(p, "Unexpected mallocx() failure"); 265 266 assert_d_eq(mallctl("thread.tcache.flush", NULL, NULL, NULL, 0), 267 config_tcache ? 0 : ENOENT, "Unexpected mallctl() result"); 268 269 assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0, 270 "Unexpected mallctl() failure"); 271 272 sz = sizeof(size_t); 273 assert_d_eq(mallctl("stats.arenas.0.bins.0.allocated", &allocated, &sz, 274 NULL, 0), expected, "Unexpected mallctl() result"); 275 sz = sizeof(uint64_t); 276 assert_d_eq(mallctl("stats.arenas.0.bins.0.nmalloc", &nmalloc, &sz, 277 NULL, 0), expected, "Unexpected mallctl() result"); 278 assert_d_eq(mallctl("stats.arenas.0.bins.0.ndalloc", &ndalloc, &sz, 279 NULL, 0), expected, "Unexpected mallctl() result"); 280 assert_d_eq(mallctl("stats.arenas.0.bins.0.nrequests", &nrequests, &sz, 281 NULL, 0), expected, "Unexpected mallctl() result"); 282 283 assert_d_eq(mallctl("stats.arenas.0.bins.0.nfills", &nfills, &sz, 284 NULL, 0), config_tcache ? expected : ENOENT, 285 "Unexpected mallctl() result"); 286 assert_d_eq(mallctl("stats.arenas.0.bins.0.nflushes", &nflushes, &sz, 287 NULL, 0), config_tcache ? expected : ENOENT, 288 "Unexpected mallctl() result"); 289 290 assert_d_eq(mallctl("stats.arenas.0.bins.0.nruns", &nruns, &sz, 291 NULL, 0), expected, "Unexpected mallctl() result"); 292 assert_d_eq(mallctl("stats.arenas.0.bins.0.nreruns", &nreruns, &sz, 293 NULL, 0), expected, "Unexpected mallctl() result"); 294 sz = sizeof(size_t); 295 assert_d_eq(mallctl("stats.arenas.0.bins.0.curruns", &curruns, &sz, 296 NULL, 0), expected, "Unexpected mallctl() result"); 297 298 if (config_stats) { 299 assert_zu_gt(allocated, 0, 300 "allocated should be greater than zero"); 301 assert_u64_gt(nmalloc, 0, 302 "nmalloc should be greater than zero"); 303 assert_u64_ge(nmalloc, ndalloc, 304 "nmalloc should be at least as large as ndalloc"); 305 assert_u64_gt(nrequests, 0, 306 "nrequests should be greater than zero"); 307 if (config_tcache) { 308 assert_u64_gt(nfills, 0, 309 "At least one fill should have occurred"); 310 assert_u64_gt(nflushes, 0, 311 "At least one flush should have occurred"); 312 } 313 assert_u64_gt(nruns, 0, 314 "At least one run should have been allocated"); 315 assert_zu_gt(curruns, 0, 316 "At least one run should be currently allocated"); 317 } 318 319 dallocx(p, 0); 320 } 321 TEST_END 322 323 TEST_BEGIN(test_stats_arenas_lruns) 324 { 325 unsigned arena; 326 void *p; 327 uint64_t epoch, nmalloc, ndalloc, nrequests; 328 size_t curruns, sz; 329 int expected = config_stats ? 0 : ENOENT; 330 331 arena = 0; 332 assert_d_eq(mallctl("thread.arena", NULL, NULL, &arena, sizeof(arena)), 333 0, "Unexpected mallctl() failure"); 334 335 p = mallocx(SMALL_MAXCLASS+1, 0); 336 assert_ptr_not_null(p, "Unexpected mallocx() failure"); 337 338 assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0, 339 "Unexpected mallctl() failure"); 340 341 sz = sizeof(uint64_t); 342 assert_d_eq(mallctl("stats.arenas.0.lruns.0.nmalloc", &nmalloc, &sz, 343 NULL, 0), expected, "Unexpected mallctl() result"); 344 assert_d_eq(mallctl("stats.arenas.0.lruns.0.ndalloc", &ndalloc, &sz, 345 NULL, 0), expected, "Unexpected mallctl() result"); 346 assert_d_eq(mallctl("stats.arenas.0.lruns.0.nrequests", &nrequests, &sz, 347 NULL, 0), expected, "Unexpected mallctl() result"); 348 sz = sizeof(size_t); 349 assert_d_eq(mallctl("stats.arenas.0.lruns.0.curruns", &curruns, &sz, 350 NULL, 0), expected, "Unexpected mallctl() result"); 351 352 if (config_stats) { 353 assert_u64_gt(nmalloc, 0, 354 "nmalloc should be greater than zero"); 355 assert_u64_ge(nmalloc, ndalloc, 356 "nmalloc should be at least as large as ndalloc"); 357 assert_u64_gt(nrequests, 0, 358 "nrequests should be greater than zero"); 359 assert_u64_gt(curruns, 0, 360 "At least one run should be currently allocated"); 361 } 362 363 dallocx(p, 0); 364 } 365 TEST_END 366 367 int 368 main(void) 369 { 370 371 return (test( 372 test_stats_summary, 373 test_stats_chunks, 374 test_stats_huge, 375 test_stats_arenas_summary, 376 test_stats_arenas_small, 377 test_stats_arenas_large, 378 test_stats_arenas_bins, 379 test_stats_arenas_lruns)); 380 } 381