@@ -182,7 +182,7 @@ bool _mi_bitmap_is_any_claimed(mi_bitmap_t bitmap, size_t bitmap_fields, size_t
182182// Try to atomically claim a sequence of `count` bits starting from the field
183183// at `idx` in `bitmap` and crossing into subsequent fields. Returns `true` on success.
184184// Only needs to consider crossing into the next fields (see `mi_bitmap_try_find_from_claim_across`)
185- static bool mi_bitmap_try_find_claim_field_across (mi_bitmap_t bitmap , size_t bitmap_fields , size_t idx , const size_t count , const size_t retries , mi_bitmap_index_t * bitmap_idx )
185+ static bool mi_bitmap_try_find_claim_field_across (mi_bitmap_t bitmap , size_t bitmap_fields , size_t idx , const size_t count , const size_t retries , mi_bitmap_index_t * bitmap_idx , mi_stats_t * stats )
186186{
187187 mi_assert_internal (bitmap_idx != NULL );
188188
@@ -242,6 +242,7 @@ static bool mi_bitmap_try_find_claim_field_across(mi_bitmap_t bitmap, size_t bit
242242 } while (!mi_atomic_cas_strong_acq_rel (field , & map , newmap ));
243243
244244 // claimed!
245+ mi_stat_counter_increase (stats -> arena_crossover_count ,1 );
245246 * bitmap_idx = mi_bitmap_index_create (idx , initial_idx );
246247 return true;
247248
@@ -261,9 +262,10 @@ static bool mi_bitmap_try_find_claim_field_across(mi_bitmap_t bitmap, size_t bit
261262 newmap = (map & ~initial_mask );
262263 } while (!mi_atomic_cas_strong_acq_rel (field , & map , newmap ));
263264 }
265+ mi_stat_counter_increase (stats -> arena_rollback_count ,1 );
264266 // retry? (we make a recursive call instead of goto to be able to use const declarations)
265267 if (retries <= 2 ) {
266- return mi_bitmap_try_find_claim_field_across (bitmap , bitmap_fields , idx , count , retries + 1 , bitmap_idx );
268+ return mi_bitmap_try_find_claim_field_across (bitmap , bitmap_fields , idx , count , retries + 1 , bitmap_idx , stats );
267269 }
268270 else {
269271 return false;
@@ -273,7 +275,7 @@ static bool mi_bitmap_try_find_claim_field_across(mi_bitmap_t bitmap, size_t bit
273275
274276// Find `count` bits of zeros and set them to 1 atomically; returns `true` on success.
275277// Starts at idx, and wraps around to search in all `bitmap_fields` fields.
276- bool _mi_bitmap_try_find_from_claim_across (mi_bitmap_t bitmap , const size_t bitmap_fields , const size_t start_field_idx , const size_t count , mi_bitmap_index_t * bitmap_idx ) {
278+ bool _mi_bitmap_try_find_from_claim_across (mi_bitmap_t bitmap , const size_t bitmap_fields , const size_t start_field_idx , const size_t count , mi_bitmap_index_t * bitmap_idx , mi_stats_t * stats ) {
277279 mi_assert_internal (count > 0 );
278280 if (count <= 2 ) {
279281 // we don't bother with crossover fields for small counts
@@ -285,13 +287,15 @@ bool _mi_bitmap_try_find_from_claim_across(mi_bitmap_t bitmap, const size_t bitm
285287 for (size_t visited = 0 ; visited < bitmap_fields ; visited ++ , idx ++ ) {
286288 if (idx >= bitmap_fields ) { idx = 0 ; } // wrap
287289 // first try to claim inside a field
290+ /*
288291 if (count <= MI_BITMAP_FIELD_BITS) {
289292 if (_mi_bitmap_try_find_claim_field(bitmap, idx, count, bitmap_idx)) {
290293 return true;
291294 }
292295 }
296+ */
293297 // if that fails, then try to claim across fields
294- if (mi_bitmap_try_find_claim_field_across (bitmap , bitmap_fields , idx , count , 0 , bitmap_idx )) {
298+ if (mi_bitmap_try_find_claim_field_across (bitmap , bitmap_fields , idx , count , 0 , bitmap_idx , stats )) {
295299 return true;
296300 }
297301 }
0 commit comments