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

Function mi_segments_page_alloc

3rd/mimalloc-2.0.9/src/segment.c:1489–1513  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1487----------------------------------------------------------- */
1488
1489static mi_page_t* mi_segments_page_alloc(mi_heap_t* heap, mi_page_kind_t page_kind, size_t required, size_t block_size, mi_segments_tld_t* tld, mi_os_tld_t* os_tld)
1490{
1491 mi_assert_internal(required <= MI_LARGE_OBJ_SIZE_MAX && page_kind <= MI_PAGE_LARGE);
1492
1493 // find a free page
1494 size_t page_size = _mi_align_up(required, (required > MI_MEDIUM_PAGE_SIZE ? MI_MEDIUM_PAGE_SIZE : MI_SEGMENT_SLICE_SIZE));
1495 size_t slices_needed = page_size / MI_SEGMENT_SLICE_SIZE;
1496 mi_assert_internal(slices_needed * MI_SEGMENT_SLICE_SIZE == page_size);
1497 mi_page_t* page = mi_segments_page_find_and_allocate(slices_needed, heap->arena_id, tld); //(required <= MI_SMALL_SIZE_MAX ? 0 : slices_needed), tld);
1498 if (page==NULL) {
1499 // no free page, allocate a new segment and try again
1500 if (mi_segment_reclaim_or_alloc(heap, slices_needed, block_size, tld, os_tld) == NULL) {
1501 // OOM or reclaimed a good page in the heap
1502 return NULL;
1503 }
1504 else {
1505 // otherwise try again
1506 return mi_segments_page_alloc(heap, page_kind, required, block_size, tld, os_tld);
1507 }
1508 }
1509 mi_assert_internal(page != NULL && page->slice_count*MI_SEGMENT_SLICE_SIZE == page_size);
1510 mi_assert_internal(_mi_ptr_segment(page)->thread_id == _mi_thread_id());
1511 mi_segment_delayed_decommit(_mi_ptr_segment(page), false, tld->stats);
1512 return page;
1513}
1514
1515
1516

Callers 1

ifFunction · 0.85

Calls 6

_mi_align_upFunction · 0.85
_mi_ptr_segmentFunction · 0.85
_mi_thread_idFunction · 0.85

Tested by

no test coverage detected