Skip to content

Commit 56d1a85

Browse files
committed
Merge branch 'dev' into dev-abandon
2 parents d86c105 + 027b22a commit 56d1a85

File tree

6 files changed

+23
-11
lines changed

6 files changed

+23
-11
lines changed

include/mimalloc/types.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,9 @@ typedef struct mi_stats_s {
546546
mi_stat_counter_t normal_count;
547547
mi_stat_counter_t huge_count;
548548
mi_stat_counter_t giant_count;
549+
mi_stat_counter_t arena_count;
550+
mi_stat_counter_t arena_crossover_count;
551+
mi_stat_counter_t arena_rollback_count;
549552
#if MI_STAT>1
550553
mi_stat_count_t normal_bins[MI_BIN_HUGE+1];
551554
#endif

src/arena.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -208,10 +208,10 @@ static void* mi_arena_block_start(mi_arena_t* arena, mi_bitmap_index_t bindex) {
208208
----------------------------------------------------------- */
209209

210210
// claim the `blocks_inuse` bits
211-
static bool mi_arena_try_claim(mi_arena_t* arena, size_t blocks, mi_bitmap_index_t* bitmap_idx)
211+
static bool mi_arena_try_claim(mi_arena_t* arena, size_t blocks, mi_bitmap_index_t* bitmap_idx, mi_stats_t* stats)
212212
{
213213
size_t idx = 0; // mi_atomic_load_relaxed(&arena->search_idx); // start from last search; ok to be relaxed as the exact start does not matter
214-
if (_mi_bitmap_try_find_from_claim_across(arena->blocks_inuse, arena->field_count, idx, blocks, bitmap_idx)) {
214+
if (_mi_bitmap_try_find_from_claim_across(arena->blocks_inuse, arena->field_count, idx, blocks, bitmap_idx, stats)) {
215215
mi_atomic_store_relaxed(&arena->search_idx, mi_bitmap_index_field(*bitmap_idx)); // start search from found location next time around
216216
return true;
217217
};
@@ -230,7 +230,7 @@ static mi_decl_noinline void* mi_arena_try_alloc_at(mi_arena_t* arena, size_t ar
230230
mi_assert_internal(mi_arena_id_index(arena->id) == arena_index);
231231

232232
mi_bitmap_index_t bitmap_index;
233-
if (!mi_arena_try_claim(arena, needed_bcount, &bitmap_index)) return NULL;
233+
if (!mi_arena_try_claim(arena, needed_bcount, &bitmap_index, tld->stats)) return NULL;
234234

235235
// claimed it!
236236
void* p = mi_arena_block_start(arena, bitmap_index);
@@ -868,7 +868,7 @@ mi_segment_t* _mi_arena_segment_clear_abandoned_next(mi_arena_field_cursor_t* pr
868868
Add an arena.
869869
----------------------------------------------------------- */
870870

871-
static bool mi_arena_add(mi_arena_t* arena, mi_arena_id_t* arena_id) {
871+
static bool mi_arena_add(mi_arena_t* arena, mi_arena_id_t* arena_id, mi_stats_t* stats) {
872872
mi_assert_internal(arena != NULL);
873873
mi_assert_internal((uintptr_t)mi_atomic_load_ptr_relaxed(uint8_t,&arena->start) % MI_SEGMENT_ALIGN == 0);
874874
mi_assert_internal(arena->block_count > 0);
@@ -879,6 +879,7 @@ static bool mi_arena_add(mi_arena_t* arena, mi_arena_id_t* arena_id) {
879879
mi_atomic_decrement_acq_rel(&mi_arena_count);
880880
return false;
881881
}
882+
mi_stat_counter_increase(stats->arena_count,1);
882883
arena->id = mi_arena_id_create(i);
883884
mi_atomic_store_ptr_release(mi_arena_t,&mi_arenas[i], arena);
884885
if (arena_id != NULL) { *arena_id = arena->id; }
@@ -934,7 +935,7 @@ static bool mi_manage_os_memory_ex2(void* start, size_t size, bool is_large, int
934935
mi_bitmap_index_t postidx = mi_bitmap_index_create(fields - 1, MI_BITMAP_FIELD_BITS - post);
935936
_mi_bitmap_claim(arena->blocks_inuse, fields, post, postidx, NULL);
936937
}
937-
return mi_arena_add(arena, arena_id);
938+
return mi_arena_add(arena, arena_id, &_mi_stats_main);
938939

939940
}
940941

src/bitmap.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/bitmap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ bool _mi_bitmap_is_any_claimed(mi_bitmap_t bitmap, size_t bitmap_fields, size_t
9090

9191
// Find `count` bits of zeros and set them to 1 atomically; returns `true` on success.
9292
// Starts at idx, and wraps around to search in all `bitmap_fields` fields.
93-
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);
93+
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);
9494

9595
// Set `count` bits at `bitmap_idx` to 0 atomically
9696
// Returns `true` if all `count` bits were 1 previously.

src/init.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ const mi_page_t _mi_page_empty = {
7878
MI_STAT_COUNT_NULL(), MI_STAT_COUNT_NULL(), \
7979
MI_STAT_COUNT_NULL(), \
8080
{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
81-
{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } \
81+
{ 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \
82+
{ 0, 0 }, { 0, 0 }, { 0, 0 } \
8283
MI_STAT_COUNT_END_NULL()
8384

8485
// --------------------------------------------------------

src/stats.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,9 @@ static void _mi_stats_print(mi_stats_t* stats, mi_output_fun* out0, void* arg0)
340340
mi_stat_print(&stats->pages_abandoned, "-abandoned", -1, out, arg);
341341
mi_stat_counter_print(&stats->pages_extended, "-extended", out, arg);
342342
mi_stat_counter_print(&stats->page_no_retire, "-noretire", out, arg);
343+
mi_stat_counter_print(&stats->arena_count, "arenas", out, arg);
344+
mi_stat_counter_print(&stats->arena_crossover_count, "-crossover", out, arg);
345+
mi_stat_counter_print(&stats->arena_rollback_count, "-rollback", out, arg);
343346
mi_stat_counter_print(&stats->mmap_calls, "mmaps", out, arg);
344347
mi_stat_counter_print(&stats->commit_calls, "commits", out, arg);
345348
mi_stat_counter_print(&stats->reset_calls, "resets", out, arg);

0 commit comments

Comments
 (0)