mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-07-07 03:48:42 +03:00
enable non eager-commit flag
This commit is contained in:
parent
d8c47bfed2
commit
46a9e51f74
5 changed files with 53 additions and 36 deletions
|
@ -235,7 +235,7 @@ static mi_segment_t* _mi_segment_cache_findx(mi_segments_tld_t* tld, size_t requ
|
|||
if (mi_option_is_enabled(mi_option_secure)) {
|
||||
_mi_os_unprotect(segment, segment->segment_size);
|
||||
}
|
||||
if (_mi_os_shrink(segment, segment->segment_size, required, tld->stats)) {
|
||||
if (_mi_os_shrink(segment, segment->segment_size, required, tld->stats)) { // note: double decommit must be (ok on windows)
|
||||
tld->current_size -= segment->segment_size;
|
||||
tld->current_size += required;
|
||||
segment->segment_size = required;
|
||||
|
@ -253,18 +253,12 @@ static mi_segment_t* _mi_segment_cache_findx(mi_segments_tld_t* tld, size_t requ
|
|||
return NULL;
|
||||
}
|
||||
|
||||
// note: the returned segment might be reset
|
||||
static mi_segment_t* mi_segment_cache_find(mi_segments_tld_t* tld, size_t required) {
|
||||
mi_segment_t* segment = _mi_segment_cache_findx(tld,required,false);
|
||||
if (segment != NULL &&
|
||||
mi_option_is_enabled(mi_option_eager_commit) &&
|
||||
(mi_option_is_enabled(mi_option_cache_reset) || mi_option_is_enabled(mi_option_page_reset)))
|
||||
{
|
||||
// ensure the memory is available
|
||||
_mi_os_unreset((uint8_t*)segment + segment->segment_info_size, segment->segment_size - segment->segment_info_size, tld->stats);
|
||||
}
|
||||
return segment;
|
||||
return _mi_segment_cache_findx(tld,required,false);
|
||||
}
|
||||
|
||||
// note: the returned segment might be reset
|
||||
static mi_segment_t* mi_segment_cache_evict(mi_segments_tld_t* tld) {
|
||||
// TODO: random eviction instead?
|
||||
return _mi_segment_cache_findx(tld, 0, true /* from the end */);
|
||||
|
@ -359,9 +353,16 @@ static mi_segment_t* mi_segment_alloc( size_t required, mi_page_kind_t page_kind
|
|||
protection_still_good = true; // otherwise, the guard pages are still in place
|
||||
}
|
||||
}
|
||||
if (page_kind != MI_PAGE_SMALL && !mi_option_is_enabled(mi_option_eager_commit) &&
|
||||
(mi_option_is_enabled(mi_option_cache_reset) || mi_option_is_enabled(mi_option_page_reset))) {
|
||||
_mi_os_commit(segment, segment->segment_size, tld->stats);
|
||||
if (!mi_option_is_enabled(mi_option_eager_commit)) {
|
||||
if (page_kind != MI_PAGE_SMALL) {
|
||||
_mi_os_commit(segment, segment->segment_size, tld->stats);
|
||||
}
|
||||
else {
|
||||
// ok, commit (and unreset) on demand again
|
||||
}
|
||||
}
|
||||
else if (mi_option_is_enabled(mi_option_cache_reset) || mi_option_is_enabled(mi_option_page_reset)) {
|
||||
_mi_os_unreset(segment, segment->segment_size, tld->stats);
|
||||
}
|
||||
}
|
||||
// and otherwise allocate it from the OS
|
||||
|
@ -369,11 +370,11 @@ static mi_segment_t* mi_segment_alloc( size_t required, mi_page_kind_t page_kind
|
|||
segment = (mi_segment_t*)_mi_os_alloc_aligned(segment_size, MI_SEGMENT_SIZE, commit, os_tld);
|
||||
if (segment == NULL) return NULL;
|
||||
mi_segments_track_size((long)segment_size,tld);
|
||||
if (!commit) {
|
||||
_mi_os_commit(segment, info_size, tld->stats); // always commit start of the segment
|
||||
}
|
||||
}
|
||||
mi_assert_internal(segment != NULL && (uintptr_t)segment % MI_SEGMENT_SIZE == 0);
|
||||
if (!commit) {
|
||||
_mi_os_commit(segment,info_size,tld->stats);
|
||||
}
|
||||
memset(segment, 0, info_size);
|
||||
|
||||
if (mi_option_is_enabled(mi_option_secure) && !protection_still_good) {
|
||||
|
@ -403,7 +404,8 @@ static mi_segment_t* mi_segment_alloc( size_t required, mi_page_kind_t page_kind
|
|||
segment->cookie = _mi_ptr_cookie(segment);
|
||||
for (uint8_t i = 0; i < segment->capacity; i++) {
|
||||
segment->pages[i].segment_idx = i;
|
||||
segment->pages[i].is_reset = !commit;
|
||||
segment->pages[i].is_reset = false;
|
||||
segment->pages[i].is_committed = commit;
|
||||
}
|
||||
_mi_stat_increase(&tld->stats->page_committed, segment->segment_info_size);
|
||||
//fprintf(stderr,"mimalloc: alloc segment at %p\n", (void*)segment);
|
||||
|
@ -477,18 +479,18 @@ static mi_page_t* mi_segment_find_free(mi_segment_t* segment, mi_stats_t* stats)
|
|||
for (size_t i = 0; i < segment->capacity; i++) {
|
||||
mi_page_t* page = &segment->pages[i];
|
||||
if (!page->segment_in_use) {
|
||||
if (page->is_reset) {
|
||||
if (page->is_reset || !page->is_committed) {
|
||||
size_t psize;
|
||||
uint8_t* start = _mi_page_start(segment, page, &psize);
|
||||
page->is_reset = false;
|
||||
if (mi_option_is_enabled(mi_option_eager_commit)) {
|
||||
_mi_os_unreset(start, psize, stats);
|
||||
}
|
||||
else {
|
||||
// note we could allow both lazy commit, and page level reset if we add a `is_commit` flag...
|
||||
// for now we use commit for both
|
||||
_mi_os_commit(start, psize, stats);
|
||||
mi_assert_internal(!(page->is_reset && !page->is_committed));
|
||||
if (!page->is_committed) {
|
||||
page->is_committed = true;
|
||||
_mi_os_commit(start,psize,stats);
|
||||
}
|
||||
if (page->is_reset) {
|
||||
page->is_reset = false;
|
||||
_mi_os_unreset(start, psize, stats);
|
||||
}
|
||||
}
|
||||
return page;
|
||||
}
|
||||
|
@ -508,6 +510,7 @@ static void mi_segment_page_clear(mi_segment_t* segment, mi_page_t* page, mi_sta
|
|||
UNUSED(stats);
|
||||
mi_assert_internal(page->segment_in_use);
|
||||
mi_assert_internal(mi_page_all_free(page));
|
||||
mi_assert_internal(page->is_committed);
|
||||
size_t inuse = page->capacity * page->block_size;
|
||||
_mi_stat_decrease(&stats->page_committed, inuse);
|
||||
_mi_stat_decrease(&stats->pages, 1);
|
||||
|
@ -523,10 +526,12 @@ static void mi_segment_page_clear(mi_segment_t* segment, mi_page_t* page, mi_sta
|
|||
// zero the page data
|
||||
uint8_t idx = page->segment_idx; // don't clear the index
|
||||
bool is_reset = page->is_reset; // don't clear the reset flag
|
||||
bool is_committed = page->is_committed; // don't clear the commit flag
|
||||
memset(page, 0, sizeof(*page));
|
||||
page->segment_idx = idx;
|
||||
page->segment_in_use = false;
|
||||
page->is_reset = is_reset;
|
||||
page->is_committed = is_committed;
|
||||
segment->used--;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue