fix bug in committed check in arena allocation
This commit is contained in:
parent
4ae51096ec
commit
ecece57284
@ -107,6 +107,7 @@ static bool mi_arena_alloc(mi_arena_t* arena, size_t blocks, mi_bitmap_index_t*
|
|||||||
size_t idx = mi_atomic_read(&arena->search_idx); // start from last search
|
size_t idx = mi_atomic_read(&arena->search_idx); // start from last search
|
||||||
for (size_t visited = 0; visited < fcount; visited++, idx++) {
|
for (size_t visited = 0; visited < fcount; visited++, idx++) {
|
||||||
if (idx >= fcount) idx = 0; // wrap around
|
if (idx >= fcount) idx = 0; // wrap around
|
||||||
|
// try to atomically claim a range of bits
|
||||||
if (mi_bitmap_try_find_claim_field(arena->blocks_inuse, idx, blocks, bitmap_idx)) {
|
if (mi_bitmap_try_find_claim_field(arena->blocks_inuse, idx, blocks, bitmap_idx)) {
|
||||||
mi_atomic_write(&arena->search_idx, idx); // start search from here next time
|
mi_atomic_write(&arena->search_idx, idx); // start search from here next time
|
||||||
return true;
|
return true;
|
||||||
@ -135,8 +136,8 @@ static void* mi_arena_alloc_from(mi_arena_t* arena, size_t arena_index, size_t n
|
|||||||
// always committed
|
// always committed
|
||||||
*commit = true;
|
*commit = true;
|
||||||
}
|
}
|
||||||
else if (commit) {
|
else if (*commit) {
|
||||||
// ensure commit now
|
// arena not committed as a whole, but commit requested: ensure commit now
|
||||||
bool any_uncommitted;
|
bool any_uncommitted;
|
||||||
mi_bitmap_claim(arena->blocks_committed, arena->field_count, needed_bcount, bitmap_index, &any_uncommitted);
|
mi_bitmap_claim(arena->blocks_committed, arena->field_count, needed_bcount, bitmap_index, &any_uncommitted);
|
||||||
if (any_uncommitted) {
|
if (any_uncommitted) {
|
||||||
|
Loading…
Reference in New Issue
Block a user