mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-08-27 17:54:47 +03:00
improve page commit on demand
This commit is contained in:
parent
ba68810333
commit
d21114b5f2
7 changed files with 101 additions and 56 deletions
25
src/page.c
25
src/page.c
|
@ -251,8 +251,10 @@ void _mi_page_abandon(mi_page_t* page, mi_page_queue_t* pq) {
|
|||
}
|
||||
else {
|
||||
mi_page_queue_remove(pq, page);
|
||||
mi_tld_t* tld = page->heap->tld;
|
||||
mi_page_set_heap(page, NULL);
|
||||
_mi_arenas_page_abandon(page);
|
||||
_mi_arenas_page_abandon(page);
|
||||
_mi_arenas_collect(false, false, tld); // allow purging
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -263,7 +265,7 @@ static mi_page_t* mi_page_fresh_alloc(mi_heap_t* heap, mi_page_queue_t* pq, size
|
|||
mi_assert_internal(pq != NULL);
|
||||
mi_assert_internal(mi_heap_contains_queue(heap, pq));
|
||||
mi_assert_internal(page_alignment > 0 || block_size > MI_LARGE_MAX_OBJ_SIZE || block_size == pq->block_size);
|
||||
#endif
|
||||
#endif
|
||||
mi_page_t* page = _mi_arenas_page_alloc(heap, block_size, page_alignment);
|
||||
if (page == NULL) {
|
||||
// out-of-memory
|
||||
|
@ -359,7 +361,7 @@ void _mi_page_free(mi_page_t* page, mi_page_queue_t* pq) {
|
|||
mi_heap_t* heap = page->heap;
|
||||
mi_page_set_heap(page,NULL);
|
||||
_mi_arenas_page_free(page);
|
||||
_mi_arenas_collect(false, heap->tld); // allow purging
|
||||
_mi_arenas_collect(false, false, heap->tld); // allow purging
|
||||
}
|
||||
|
||||
#define MI_MAX_RETIRE_SIZE MI_LARGE_OBJ_SIZE_MAX // should be less than size for MI_BIN_HUGE
|
||||
|
@ -607,14 +609,13 @@ static void mi_page_extend_free(mi_heap_t* heap, mi_page_t* page) {
|
|||
mi_assert_internal(extend < (1UL<<16));
|
||||
|
||||
// commit on demand?
|
||||
if (page->page_committed > 0) {
|
||||
if (page->slice_committed > 0) {
|
||||
const size_t needed_size = (page->capacity + extend)*bsize;
|
||||
if (needed_size > page->page_committed) {
|
||||
size_t commit_size = _mi_align_up(needed_size, MI_PAGE_MIN_COMMIT_SIZE);
|
||||
const size_t max_size = page->reserved * bsize;
|
||||
if (commit_size > max_size) { commit_size = max_size; }
|
||||
mi_assert(commit_size > page->page_committed);
|
||||
_mi_os_commit(mi_page_start(page) + page->page_committed, commit_size - page->page_committed, NULL);
|
||||
const size_t needed_commit = _mi_align_up( mi_page_slice_offset_of(page, needed_size), MI_PAGE_MIN_COMMIT_SIZE );
|
||||
if (needed_commit > page->slice_committed) {
|
||||
mi_assert_internal(((needed_commit - page->slice_committed) % _mi_os_page_size()) == 0);
|
||||
_mi_os_commit(mi_page_slice_start(page) + page->slice_committed, needed_commit - page->slice_committed, NULL);
|
||||
page->slice_committed = needed_commit;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -647,8 +648,8 @@ void _mi_page_init(mi_heap_t* heap, mi_page_t* page) {
|
|||
#endif
|
||||
#if MI_DEBUG>2
|
||||
if (page->memid.initially_zero) {
|
||||
mi_track_mem_defined(page->page_start, (page->page_committed == 0 ? page_size : page->page_committed));
|
||||
mi_assert_expensive(mi_mem_is_zero(page_start, (page->page_committed == 0 ? page_size : page->page_committed)));
|
||||
mi_track_mem_defined(page->page_start, mi_page_committed(page));
|
||||
mi_assert_expensive(mi_mem_is_zero(page_start, mi_page_committed(page)));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue