| 227 | |
| 228 | |
| 229 | static void mi_page_queue_push(mi_heap_t* heap, mi_page_queue_t* queue, mi_page_t* page) { |
| 230 | mi_assert_internal(mi_page_heap(page) == heap); |
| 231 | mi_assert_internal(!mi_page_queue_contains(queue, page)); |
| 232 | #if MI_HUGE_PAGE_ABANDON |
| 233 | mi_assert_internal(_mi_page_segment(page)->kind != MI_SEGMENT_HUGE); |
| 234 | #endif |
| 235 | mi_assert_internal(page->xblock_size == queue->block_size || |
| 236 | (page->xblock_size > MI_MEDIUM_OBJ_SIZE_MAX) || |
| 237 | (mi_page_is_in_full(page) && mi_page_queue_is_full(queue))); |
| 238 | |
| 239 | mi_page_set_in_full(page, mi_page_queue_is_full(queue)); |
| 240 | // mi_atomic_store_ptr_release(mi_atomic_cast(void*, &page->heap), heap); |
| 241 | page->next = queue->first; |
| 242 | page->prev = NULL; |
| 243 | if (queue->first != NULL) { |
| 244 | mi_assert_internal(queue->first->prev == NULL); |
| 245 | queue->first->prev = page; |
| 246 | queue->first = page; |
| 247 | } |
| 248 | else { |
| 249 | queue->first = queue->last = page; |
| 250 | } |
| 251 | |
| 252 | // update direct |
| 253 | mi_heap_queue_first_update(heap, queue); |
| 254 | heap->page_count++; |
| 255 | } |
| 256 | |
| 257 | |
| 258 | static void mi_page_queue_enqueue_from(mi_page_queue_t* to, mi_page_queue_t* from, mi_page_t* page) { |
no test coverage detected