| 355 | } |
| 356 | |
| 357 | static void dump_memory_regions() { |
| 358 | ASSERT_MALLOC_IS_ACQUIRED(); |
| 359 | RootRegion *root = listOfAllRegions; |
| 360 | MAIN_THREAD_ASYNC_EM_ASM(out('All memory regions:')); |
| 361 | while (root) { |
| 362 | Region *r = (Region*)root; |
| 363 | assert(debug_region_is_consistent(r)); |
| 364 | uint8_t *lastRegionEnd = root->endPtr; |
| 365 | MAIN_THREAD_ASYNC_EM_ASM(out('Region block '+ptrToString($0)+' - '+ptrToString($1)+ ' ('+Number($2)+' bytes):'), |
| 366 | r, lastRegionEnd, lastRegionEnd-(uint8_t*)r); |
| 367 | while ((uint8_t*)r < lastRegionEnd) { |
| 368 | MAIN_THREAD_ASYNC_EM_ASM(out('Region '+ptrToString($0)+', size: '+Number($1)+' ('+($2?"used":"--FREE--")+')'), |
| 369 | r, r->size, region_ceiling_size(r) == r->size); |
| 370 | |
| 371 | assert(debug_region_is_consistent(r)); |
| 372 | size_t sizeFromCeiling = size_of_region_from_ceiling(r); |
| 373 | if (sizeFromCeiling != r->size) { |
| 374 | MAIN_THREAD_ASYNC_EM_ASM(out('Corrupt region! Size marker at the end of the region does not match: '+Number($0)), sizeFromCeiling); |
| 375 | } |
| 376 | if (r->size == 0) { |
| 377 | break; |
| 378 | } |
| 379 | r = next_region(r); |
| 380 | } |
| 381 | root = root->next; |
| 382 | MAIN_THREAD_ASYNC_EM_ASM(out("")); |
| 383 | } |
| 384 | MAIN_THREAD_ASYNC_EM_ASM(out('Free regions:')); |
| 385 | for (int i = 0; i < NUM_FREE_BUCKETS; ++i) { |
| 386 | Region *prev = &freeRegionBuckets[i]; |
| 387 | Region *fr = freeRegionBuckets[i].next; |
| 388 | while (fr != &freeRegionBuckets[i]) { |
| 389 | MAIN_THREAD_ASYNC_EM_ASM(out('In bucket '+$0+', free region '+ptrToString($1)+', size: ' + Number($2) + ' (size at ceiling: '+Number($3)+'), prev: ' + ptrToString($4) + ', next: ' + ptrToString($5)), |
| 390 | i, fr, fr->size, size_of_region_from_ceiling(fr), fr->prev, fr->next); |
| 391 | assert(debug_region_is_consistent(fr)); |
| 392 | assert(region_is_free(fr)); |
| 393 | assert(fr->prev == prev); |
| 394 | prev = fr; |
| 395 | assert(fr->next != fr); |
| 396 | assert(fr->prev != fr); |
| 397 | fr = fr->next; |
| 398 | } |
| 399 | } |
| 400 | MAIN_THREAD_ASYNC_EM_ASM(out('Free bucket index map: ' + Number($0).toString(2) + ' ' + Number($1).toString(2)), (uint32_t)(freeRegionBucketsUsed >> 32), (uint32_t)freeRegionBucketsUsed); |
| 401 | MAIN_THREAD_ASYNC_EM_ASM(out("")); |
| 402 | } |
| 403 | |
| 404 | void emmalloc_dump_memory_regions() { |
| 405 | MALLOC_ACQUIRE(); |
no test coverage detected