Skip to content

Commit 08c3376

Browse files
committed
fix stats for pages and page_bins
1 parent 15c917e commit 08c3376

File tree

7 files changed

+14
-9
lines changed

7 files changed

+14
-9
lines changed

include/mimalloc/internal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ void _mi_deferred_free(mi_heap_t* heap, bool force);
217217
void _mi_page_free_collect(mi_page_t* page,bool force);
218218
void _mi_page_reclaim(mi_heap_t* heap, mi_page_t* page); // callback from segments
219219

220+
size_t _mi_page_bin(const mi_page_t* page); // for stats
220221
size_t _mi_bin_size(size_t bin); // for stats
221222
size_t _mi_bin(size_t size); // for stats
222223

@@ -233,6 +234,7 @@ bool _mi_heap_area_visit_blocks(const mi_heap_area_t* area, mi_page_t* pa
233234

234235
// "stats.c"
235236
void _mi_stats_done(mi_stats_t* stats);
237+
void _mi_stats_merge_thread(mi_tld_t* tld);
236238
mi_msecs_t _mi_clock_now(void);
237239
mi_msecs_t _mi_clock_end(mi_msecs_t start);
238240
mi_msecs_t _mi_clock_start(void);

src/heap.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,7 @@ static void mi_heap_collect_ex(mi_heap_t* heap, mi_collect_t collect)
169169
_mi_arenas_collect(collect == MI_FORCE /* force purge? */);
170170

171171
// merge statistics
172-
if (collect <= MI_FORCE) {
173-
mi_stats_merge();
174-
}
172+
if (collect <= MI_FORCE) { _mi_stats_merge_thread(heap->tld); }
175173
}
176174

177175
void _mi_heap_collect_abandon(mi_heap_t* heap) {

src/page-queue.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,15 +136,15 @@ static bool mi_heap_contains_queue(const mi_heap_t* heap, const mi_page_queue_t*
136136
}
137137
#endif
138138

139-
static size_t mi_page_bin(const mi_page_t* page) {
139+
size_t _mi_page_bin(const mi_page_t* page) {
140140
const size_t bin = (mi_page_is_in_full(page) ? MI_BIN_FULL : (mi_page_is_huge(page) ? MI_BIN_HUGE : mi_bin(mi_page_block_size(page))));
141141
mi_assert_internal(bin <= MI_BIN_FULL);
142142
return bin;
143143
}
144144

145145
static mi_page_queue_t* mi_heap_page_queue_of(mi_heap_t* heap, const mi_page_t* page) {
146146
mi_assert_internal(heap!=NULL);
147-
const size_t bin = mi_page_bin(page);
147+
const size_t bin = _mi_page_bin(page);
148148
mi_page_queue_t* pq = &heap->pages[bin];
149149
mi_assert_internal((mi_page_block_size(page) == pq->block_size) ||
150150
(mi_page_is_huge(page) && mi_page_queue_is_huge(pq)) ||

src/page.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ static mi_page_t* mi_page_fresh_alloc(mi_heap_t* heap, mi_page_queue_t* pq, size
290290
mi_assert_internal(full_block_size >= block_size);
291291
mi_page_init(heap, page, full_block_size, heap->tld);
292292
mi_heap_stat_increase(heap, pages, 1);
293-
mi_heap_stat_increase(heap, page_bins[mi_page_bin(page)], 1);
293+
mi_heap_stat_increase(heap, page_bins[_mi_page_bin(page)], 1);
294294
if (pq != NULL) { mi_page_queue_push(heap, pq, page); }
295295
mi_assert_expensive(_mi_page_is_valid(page));
296296
return page;
@@ -443,8 +443,7 @@ void _mi_page_free(mi_page_t* page, mi_page_queue_t* pq, bool force) {
443443
mi_segments_tld_t* segments_tld = &heap->tld->segments;
444444
mi_page_queue_remove(pq, page);
445445

446-
// and free it
447-
mi_heap_stat_decrease(heap, page_bins[mi_page_bin(page)], 1);
446+
// and free it
448447
mi_page_set_heap(page,NULL);
449448
_mi_segment_page_free(page, force, segments_tld);
450449
}

src/segment.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,7 @@ static void mi_segment_page_clear(mi_segment_t* segment, mi_page_t* page, mi_seg
718718
size_t inuse = page->capacity * mi_page_block_size(page);
719719
_mi_stat_decrease(&tld->stats->page_committed, inuse);
720720
_mi_stat_decrease(&tld->stats->pages, 1);
721+
_mi_stat_decrease(&tld->stats->page_bins[_mi_page_bin(page)], 1);
721722

722723
page->is_zero_init = false;
723724
page->segment_in_use = false;

src/stats.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,10 @@ void mi_stats_merge(void) mi_attr_noexcept {
395395
mi_stats_merge_from( mi_stats_get_default() );
396396
}
397397

398+
void _mi_stats_merge_thread(mi_tld_t* tld) {
399+
mi_stats_merge_from( &tld->stats );
400+
}
401+
398402
void _mi_stats_done(mi_stats_t* stats) { // called from `mi_thread_done`
399403
mi_stats_merge_from(stats);
400404
}
@@ -498,7 +502,7 @@ static bool mi_heap_buf_expand(mi_heap_buf_t* hbuf) {
498502
hbuf->buf[hbuf->size-1] = 0;
499503
}
500504
if (hbuf->size > SIZE_MAX/2 || !hbuf->can_realloc) return false;
501-
const size_t newsize = (hbuf->size == 0 ? 2*MI_KiB : 2*hbuf->size);
505+
const size_t newsize = (hbuf->size == 0 ? mi_good_size(12*MI_KiB) : 2*hbuf->size);
502506
char* const newbuf = (char*)mi_rezalloc(hbuf->buf, newsize);
503507
if (newbuf == NULL) return false;
504508
hbuf->buf = newbuf;

test/test-stress.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ int main(int argc, char** argv) {
337337
mi_free(json);
338338
}
339339
#endif
340+
mi_collect(true);
340341
mi_stats_print(NULL);
341342
#endif
342343
//bench_end_program();

0 commit comments

Comments
 (0)