| 1487 | ----------------------------------------------------------- */ |
| 1488 | |
| 1489 | static 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 |
no test coverage detected