Initialize a fresh page
| 647 | |
| 648 | // Initialize a fresh page |
| 649 | static void mi_page_init(mi_heap_t* heap, mi_page_t* page, size_t block_size, mi_tld_t* tld) { |
| 650 | mi_assert(page != NULL); |
| 651 | mi_segment_t* segment = _mi_page_segment(page); |
| 652 | mi_assert(segment != NULL); |
| 653 | mi_assert_internal(block_size > 0); |
| 654 | // set fields |
| 655 | mi_page_set_heap(page, heap); |
| 656 | page->xblock_size = (block_size < MI_HUGE_BLOCK_SIZE ? (uint32_t)block_size : MI_HUGE_BLOCK_SIZE); // initialize before _mi_segment_page_start |
| 657 | size_t page_size; |
| 658 | const void* page_start = _mi_segment_page_start(segment, page, &page_size); |
| 659 | MI_UNUSED(page_start); |
| 660 | mi_track_mem_noaccess(page_start,page_size); |
| 661 | mi_assert_internal(mi_page_block_size(page) <= page_size); |
| 662 | mi_assert_internal(page_size <= page->slice_count*MI_SEGMENT_SLICE_SIZE); |
| 663 | mi_assert_internal(page_size / block_size < (1L<<16)); |
| 664 | page->reserved = (uint16_t)(page_size / block_size); |
| 665 | mi_assert_internal(page->reserved > 0); |
| 666 | #ifdef MI_ENCODE_FREELIST |
| 667 | page->keys[0] = _mi_heap_random_next(heap); |
| 668 | page->keys[1] = _mi_heap_random_next(heap); |
| 669 | #endif |
| 670 | #if MI_DEBUG > 0 |
| 671 | page->is_zero = false; // ensure in debug mode we initialize with MI_DEBUG_UNINIT, see issue #501 |
| 672 | #else |
| 673 | page->is_zero = page->is_zero_init; |
| 674 | #endif |
| 675 | |
| 676 | mi_assert_internal(page->is_committed); |
| 677 | mi_assert_internal(!page->is_reset); |
| 678 | mi_assert_internal(page->capacity == 0); |
| 679 | mi_assert_internal(page->free == NULL); |
| 680 | mi_assert_internal(page->used == 0); |
| 681 | mi_assert_internal(page->xthread_free == 0); |
| 682 | mi_assert_internal(page->next == NULL); |
| 683 | mi_assert_internal(page->prev == NULL); |
| 684 | mi_assert_internal(page->retire_expire == 0); |
| 685 | mi_assert_internal(!mi_page_has_aligned(page)); |
| 686 | #if (MI_ENCODE_FREELIST) |
| 687 | mi_assert_internal(page->keys[0] != 0); |
| 688 | mi_assert_internal(page->keys[1] != 0); |
| 689 | #endif |
| 690 | mi_assert_expensive(mi_page_is_valid_init(page)); |
| 691 | |
| 692 | // initialize an initial free list |
| 693 | mi_page_extend_free(heap,page,tld); |
| 694 | mi_assert(mi_page_immediate_available(page)); |
| 695 | } |
| 696 | |
| 697 | |
| 698 | /* ----------------------------------------------------------- |
no test coverage detected