Refactor and split page_queue_remove by behavior

The original function of page_queue_remove acutually
done more than one thing.
Not only removed the page but also cleared the page field.
I thought the function should do just one thing which is
good for reusing by other functions.
This commit is contained in:
Julian Fang 2019-08-01 22:13:30 +08:00
parent 70648635c6
commit b2b30917b9

View file

@ -241,11 +241,7 @@ static bool mi_page_queue_is_empty(mi_page_queue_t* queue) {
return (queue->first == NULL); return (queue->first == NULL);
} }
*/ */
static void _mi_page_queue_remove(mi_page_queue_t* queue, mi_page_t* page) {
static void mi_page_queue_remove(mi_page_queue_t* queue, mi_page_t* page) {
mi_assert_internal(page != NULL);
mi_assert_expensive(mi_page_queue_contains(queue, page));
mi_assert_internal(page->block_size == queue->block_size || (page->block_size > MI_LARGE_SIZE_MAX && mi_page_queue_is_huge(queue)) || (page->flags.in_full && mi_page_queue_is_full(queue)));
if (page->prev != NULL) page->prev->next = page->next; if (page->prev != NULL) page->prev->next = page->next;
if (page->next != NULL) page->next->prev = page->prev; if (page->next != NULL) page->next->prev = page->prev;
if (page == queue->last) queue->last = page->prev; if (page == queue->last) queue->last = page->prev;
@ -257,12 +253,23 @@ static void mi_page_queue_remove(mi_page_queue_t* queue, mi_page_t* page) {
mi_heap_queue_first_update(heap,queue); mi_heap_queue_first_update(heap,queue);
} }
page->heap->page_count--; page->heap->page_count--;
}
static void _mi_page_clear(mi_page_t* page) {
page->next = NULL; page->next = NULL;
page->prev = NULL; page->prev = NULL;
page->heap = NULL; page->heap = NULL;
page->flags.in_full = false; page->flags.in_full = false;
} }
static void mi_page_queue_remove_clear(mi_page_queue_t* queue, mi_page_t* page) {
mi_assert_internal(page != NULL);
mi_assert_expensive(mi_page_queue_contains(queue, page));
mi_assert_internal(page->block_size == queue->block_size || (page->block_size > MI_LARGE_SIZE_MAX && mi_page_queue_is_huge(queue)) || (page->flags.in_full && mi_page_queue_is_full(queue)));
_mi_page_queue_remove(queue, page);
_mi_page_clear(page);
}
static void mi_page_queue_push(mi_heap_t* heap, mi_page_queue_t* queue, mi_page_t* page) { static void mi_page_queue_push(mi_heap_t* heap, mi_page_queue_t* queue, mi_page_t* page) {
mi_assert_internal(page->heap == NULL); mi_assert_internal(page->heap == NULL);
@ -296,16 +303,7 @@ static void mi_page_queue_enqueue_from(mi_page_queue_t* to, mi_page_queue_t* fro
(page->block_size > MI_LARGE_SIZE_MAX && (mi_page_queue_is_huge(to) || mi_page_queue_is_full(to))) || (page->block_size > MI_LARGE_SIZE_MAX && (mi_page_queue_is_huge(to) || mi_page_queue_is_full(to))) ||
(page->block_size == from->block_size && mi_page_queue_is_full(to))); (page->block_size == from->block_size && mi_page_queue_is_full(to)));
if (page->prev != NULL) page->prev->next = page->next; _mi_page_queue_remove(from, page);
if (page->next != NULL) page->next->prev = page->prev;
if (page == from->last) from->last = page->prev;
if (page == from->first) {
from->first = page->next;
// update first
mi_heap_t* heap = page->heap;
mi_assert_internal(mi_heap_contains_queue(heap, from));
mi_heap_queue_first_update(heap, from);
}
page->prev = to->last; page->prev = to->last;
page->next = NULL; page->next = NULL;
@ -319,8 +317,8 @@ static void mi_page_queue_enqueue_from(mi_page_queue_t* to, mi_page_queue_t* fro
to->last = page; to->last = page;
mi_heap_queue_first_update(page->heap, to); mi_heap_queue_first_update(page->heap, to);
} }
page->flags.in_full = mi_page_queue_is_full(to); page->flags.in_full = mi_page_queue_is_full(to);
page->heap->page_count++;
} }
size_t _mi_page_queue_append(mi_heap_t* heap, mi_page_queue_t* pq, mi_page_queue_t* append) { size_t _mi_page_queue_append(mi_heap_t* heap, mi_page_queue_t* pq, mi_page_queue_t* append) {