allocate a fresh page from a segment
| 260 | |
| 261 | // allocate a fresh page from a segment |
| 262 | static mi_page_t* mi_page_fresh_alloc(mi_heap_t* heap, mi_page_queue_t* pq, size_t block_size, size_t page_alignment) { |
| 263 | #if !MI_HUGE_PAGE_ABANDON |
| 264 | mi_assert_internal(pq != NULL); |
| 265 | mi_assert_internal(mi_heap_contains_queue(heap, pq)); |
| 266 | mi_assert_internal(page_alignment > 0 || block_size > MI_MEDIUM_OBJ_SIZE_MAX || block_size == pq->block_size); |
| 267 | #endif |
| 268 | mi_page_t* page = _mi_segment_page_alloc(heap, block_size, page_alignment, &heap->tld->segments, &heap->tld->os); |
| 269 | if (page == NULL) { |
| 270 | // this may be out-of-memory, or an abandoned page was reclaimed (and in our queue) |
| 271 | return NULL; |
| 272 | } |
| 273 | mi_assert_internal(page_alignment >0 || block_size > MI_MEDIUM_OBJ_SIZE_MAX || _mi_page_segment(page)->kind != MI_SEGMENT_HUGE); |
| 274 | mi_assert_internal(pq!=NULL || page->xblock_size != 0); |
| 275 | mi_assert_internal(pq!=NULL || mi_page_block_size(page) >= block_size); |
| 276 | // a fresh page was found, initialize it |
| 277 | const size_t full_block_size = ((pq == NULL || mi_page_queue_is_huge(pq)) ? mi_page_block_size(page) : block_size); // see also: mi_segment_huge_page_alloc |
| 278 | mi_assert_internal(full_block_size >= block_size); |
| 279 | mi_page_init(heap, page, full_block_size, heap->tld); |
| 280 | mi_heap_stat_increase(heap, pages, 1); |
| 281 | if (pq != NULL) { mi_page_queue_push(heap, pq, page); } |
| 282 | mi_assert_expensive(_mi_page_is_valid(page)); |
| 283 | return page; |
| 284 | } |
| 285 | |
| 286 | // Get a fresh page to use |
| 287 | static mi_page_t* mi_page_fresh(mi_heap_t* heap, mi_page_queue_t* pq) { |
no test coverage detected