MCPcopy Create free account
hub / github.com/CppCXY/EmmyLuaCodeStyle / mi_page_init

Function mi_page_init

3rd/mimalloc-2.0.9/src/page.c:649–695  ·  view source on GitHub ↗

Initialize a fresh page

Source from the content-addressed store, hash-verified

647
648// Initialize a fresh page
649static 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/* -----------------------------------------------------------

Callers 1

mi_page_fresh_allocFunction · 0.85

Calls 9

_mi_page_segmentFunction · 0.85
mi_page_set_heapFunction · 0.85
_mi_segment_page_startFunction · 0.85
mi_page_block_sizeFunction · 0.85
_mi_heap_random_nextFunction · 0.85
mi_page_has_alignedFunction · 0.85
mi_page_is_valid_initFunction · 0.85
mi_page_extend_freeFunction · 0.85

Tested by

no test coverage detected