| 408 | } |
| 409 | |
| 410 | static int validate_memory_regions() { |
| 411 | ASSERT_MALLOC_IS_ACQUIRED(); |
| 412 | RootRegion *root = listOfAllRegions; |
| 413 | while (root) { |
| 414 | Region *r = (Region*)root; |
| 415 | if (!debug_region_is_consistent(r)) { |
| 416 | MAIN_THREAD_ASYNC_EM_ASM(err('Used region '+ptrToString($0)+', size: '+Number($1)+' ('+($2?"used":"--FREE--")+') is corrupt (size markers in the beginning and at the end of the region do not match!)'), |
| 417 | r, r->size, region_ceiling_size(r) == r->size); |
| 418 | return 1; |
| 419 | } |
| 420 | uint8_t *lastRegionEnd = root->endPtr; |
| 421 | while ((uint8_t*)r < lastRegionEnd) { |
| 422 | if (!debug_region_is_consistent(r)) { |
| 423 | MAIN_THREAD_ASYNC_EM_ASM(err('Used region '+ptrToString($0)+', size: '+Number($1)+' ('+($2?"used":"--FREE--")+') is corrupt (size markers in the beginning and at the end of the region do not match!)'), |
| 424 | r, r->size, region_ceiling_size(r) == r->size); |
| 425 | return 1; |
| 426 | } |
| 427 | if (r->size == 0) { |
| 428 | break; |
| 429 | } |
| 430 | r = next_region(r); |
| 431 | } |
| 432 | root = root->next; |
| 433 | } |
| 434 | for (int i = 0; i < NUM_FREE_BUCKETS; ++i) { |
| 435 | Region *prev = &freeRegionBuckets[i]; |
| 436 | Region *fr = freeRegionBuckets[i].next; |
| 437 | while (fr != &freeRegionBuckets[i]) { |
| 438 | if (!debug_region_is_consistent(fr) || !region_is_free(fr) || fr->prev != prev || fr->next == fr || fr->prev == fr) { |
| 439 | 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: 0x' + ptrToString($5) + ' is corrupt!'), |
| 440 | i, fr, fr->size, size_of_region_from_ceiling(fr), fr->prev, fr->next); |
| 441 | return 1; |
| 442 | } |
| 443 | prev = fr; |
| 444 | fr = fr->next; |
| 445 | } |
| 446 | } |
| 447 | return 0; |
| 448 | } |
| 449 | |
| 450 | int emmalloc_validate_memory_regions() { |
| 451 | MALLOC_ACQUIRE(); |
no test coverage detected