mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-08 00:09:31 +03:00
increase retire page size
This commit is contained in:
parent
09b98e0f7f
commit
54e206a0a1
1 changed files with 6 additions and 3 deletions
|
@ -393,6 +393,9 @@ void _mi_page_free(mi_page_t* page, mi_page_queue_t* pq, bool force) {
|
||||||
_mi_segment_page_free(page, force, segments_tld);
|
_mi_segment_page_free(page, force, segments_tld);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define MI_MAX_RETIRE_SIZE (4*MI_SMALL_SIZE_MAX)
|
||||||
|
|
||||||
// Retire a page with no more used blocks
|
// Retire a page with no more used blocks
|
||||||
// Important to not retire too quickly though as new
|
// Important to not retire too quickly though as new
|
||||||
// allocations might coming.
|
// allocations might coming.
|
||||||
|
@ -413,7 +416,7 @@ void _mi_page_retire(mi_page_t* page) {
|
||||||
// how to check this efficiently though...
|
// how to check this efficiently though...
|
||||||
// for now, we don't retire if it is the only page left of this size class.
|
// for now, we don't retire if it is the only page left of this size class.
|
||||||
mi_page_queue_t* pq = mi_page_queue_of(page);
|
mi_page_queue_t* pq = mi_page_queue_of(page);
|
||||||
if (mi_likely(page->xblock_size <= MI_SMALL_SIZE_MAX && !mi_page_is_in_full(page))) {
|
if (mi_likely(page->xblock_size <= MI_MAX_RETIRE_SIZE && !mi_page_is_in_full(page))) {
|
||||||
if (pq->last==page && pq->first==page) { // the only page in the queue?
|
if (pq->last==page && pq->first==page) { // the only page in the queue?
|
||||||
mi_stat_counter_increase(_mi_stats_main.page_no_retire,1);
|
mi_stat_counter_increase(_mi_stats_main.page_no_retire,1);
|
||||||
page->retire_expire = 16;
|
page->retire_expire = 16;
|
||||||
|
@ -427,7 +430,7 @@ void _mi_page_retire(mi_page_t* page) {
|
||||||
// free retired pages: we don't need to look at the entire queues
|
// free retired pages: we don't need to look at the entire queues
|
||||||
// since we only retire pages that are the last one in a queue.
|
// since we only retire pages that are the last one in a queue.
|
||||||
void _mi_heap_collect_retired(mi_heap_t* heap, bool force) {
|
void _mi_heap_collect_retired(mi_heap_t* heap, bool force) {
|
||||||
for(mi_page_queue_t* pq = heap->pages; pq->block_size <= MI_SMALL_SIZE_MAX; pq++) {
|
for(mi_page_queue_t* pq = heap->pages; pq->block_size <= MI_MAX_RETIRE_SIZE; pq++) {
|
||||||
mi_page_t* page = pq->first;
|
mi_page_t* page = pq->first;
|
||||||
if (page != NULL && page->retire_expire != 0) {
|
if (page != NULL && page->retire_expire != 0) {
|
||||||
if (mi_page_all_free(page)) {
|
if (mi_page_all_free(page)) {
|
||||||
|
@ -684,7 +687,7 @@ static mi_page_t* mi_page_queue_find_free_ex(mi_heap_t* heap, mi_page_queue_t* p
|
||||||
mi_stat_counter_increase(heap->tld->stats.searches, count);
|
mi_stat_counter_increase(heap->tld->stats.searches, count);
|
||||||
|
|
||||||
if (page == NULL) {
|
if (page == NULL) {
|
||||||
_mi_heap_collect_retired(heap, false); // perhaps make a page available
|
_mi_heap_collect_retired(heap, false); // perhaps make a page available?
|
||||||
page = mi_page_fresh(heap, pq);
|
page = mi_page_fresh(heap, pq);
|
||||||
if (page == NULL && first_try) {
|
if (page == NULL && first_try) {
|
||||||
// out-of-memory _or_ an abandoned page with free blocks was reclaimed, try once again
|
// out-of-memory _or_ an abandoned page with free blocks was reclaimed, try once again
|
||||||
|
|
Loading…
Add table
Reference in a new issue