mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-05 23:19:31 +03:00
try allocating non-eager segments in non-fixed memory
This commit is contained in:
parent
23b5593af6
commit
18e02c3766
2 changed files with 19 additions and 7 deletions
18
src/memory.c
18
src/memory.c
|
@ -262,7 +262,7 @@ static bool mi_region_alloc_blocks(mem_region_t* region, size_t idx, size_t bloc
|
||||||
mi_assert_internal((m >> bitidx) == mask); // no overflow?
|
mi_assert_internal((m >> bitidx) == mask); // no overflow?
|
||||||
uintptr_t newmap = map | m;
|
uintptr_t newmap = map | m;
|
||||||
mi_assert_internal((newmap^map) >> bitidx == mask);
|
mi_assert_internal((newmap^map) >> bitidx == mask);
|
||||||
if (!mi_atomic_cas_weak(®ion->map, newmap, map)) {
|
if (!mi_atomic_cas_weak(®ion->map, newmap, map)) { // TODO: use strong cas here?
|
||||||
// no success, another thread claimed concurrently.. keep going
|
// no success, another thread claimed concurrently.. keep going
|
||||||
map = mi_atomic_read(®ion->map);
|
map = mi_atomic_read(®ion->map);
|
||||||
continue;
|
continue;
|
||||||
|
@ -300,11 +300,23 @@ static bool mi_region_try_alloc_blocks(size_t idx, size_t blocks, size_t size, b
|
||||||
mem_region_t* region = ®ions[idx];
|
mem_region_t* region = ®ions[idx];
|
||||||
uintptr_t m = mi_atomic_read_relaxed(®ion->map);
|
uintptr_t m = mi_atomic_read_relaxed(®ion->map);
|
||||||
if (m != MI_REGION_MAP_FULL) { // some bits are zero
|
if (m != MI_REGION_MAP_FULL) { // some bits are zero
|
||||||
|
bool ok = (commit || *large); // committing or allow-large is always ok
|
||||||
|
if (!ok) {
|
||||||
|
// otherwise skip incompatible regions if possible.
|
||||||
|
// this is not guaranteed due to multiple threads allocating at the same time but
|
||||||
|
// that's ok. In secure mode, large is never allowed so that works out; otherwise
|
||||||
|
// we might just not be able to reset/decommit individual pages sometimes.
|
||||||
|
mi_region_info_t info = mi_atomic_read_relaxed(®ion->info);
|
||||||
|
bool is_large;
|
||||||
|
bool is_committed;
|
||||||
|
void* start = mi_region_info_read(info,&is_large,&is_committed);
|
||||||
|
ok = (start == NULL || (commit || !is_committed) || (*large || !is_large)); // Todo: test with one bitmap operation?
|
||||||
|
}
|
||||||
|
if (ok) {
|
||||||
return mi_region_alloc_blocks(region, idx, blocks, size, commit, large, p, id, tld);
|
return mi_region_alloc_blocks(region, idx, blocks, size, commit, large, p, id, tld);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
return true; // no error, but no success either
|
|
||||||
}
|
}
|
||||||
|
return true; // no error, but no success either
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
/* ----------------------------------------------------------------------------
|
||||||
|
|
|
@ -60,7 +60,7 @@ static mi_option_desc_t options[_mi_option_last] =
|
||||||
// the following options are experimental and not all combinations make sense.
|
// the following options are experimental and not all combinations make sense.
|
||||||
{ 1, UNINIT, MI_OPTION(eager_commit) }, // note: needs to be on when eager_region_commit is enabled
|
{ 1, UNINIT, MI_OPTION(eager_commit) }, // note: needs to be on when eager_region_commit is enabled
|
||||||
#ifdef _WIN32 // and BSD?
|
#ifdef _WIN32 // and BSD?
|
||||||
{ 1, UNINIT, MI_OPTION(eager_region_commit) }, // don't commit too eagerly on windows (just for looks...)
|
{ 0, UNINIT, MI_OPTION(eager_region_commit) }, // don't commit too eagerly on windows (just for looks...)
|
||||||
#else
|
#else
|
||||||
{ 1, UNINIT, MI_OPTION(eager_region_commit) },
|
{ 1, UNINIT, MI_OPTION(eager_region_commit) },
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue