Skip to content

Commit cf7fa1c

Browse files
committed
merge from dev
2 parents f81115d + 08c3376 commit cf7fa1c

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
@@ -219,6 +219,7 @@ void _mi_deferred_free(mi_heap_t* heap, bool force);
219219
void _mi_page_free_collect(mi_page_t* page,bool force);
220220
void _mi_page_reclaim(mi_heap_t* heap, mi_page_t* page); // callback from segments
221221

222+
size_t _mi_page_bin(const mi_page_t* page); // for stats
222223
size_t _mi_bin_size(size_t bin); // for stats
223224
size_t _mi_bin(size_t size); // for stats
224225

@@ -235,6 +236,7 @@ bool _mi_heap_area_visit_blocks(const mi_heap_area_t* area, mi_page_t* pa
235236

236237
// "stats.c"
237238
void _mi_stats_done(mi_stats_t* stats);
239+
void _mi_stats_merge_thread(mi_tld_t* tld);
238240
mi_msecs_t _mi_clock_now(void);
239241
mi_msecs_t _mi_clock_end(mi_msecs_t start);
240242
mi_msecs_t _mi_clock_start(void);

src/heap.c

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

178178
// merge statistics
179-
if (collect <= MI_FORCE) {
180-
mi_stats_merge();
181-
}
179+
if (collect <= MI_FORCE) { _mi_stats_merge_thread(heap->tld); }
182180
}
183181

184182
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
@@ -140,15 +140,15 @@ static inline bool mi_page_is_large_or_huge(const mi_page_t* page) {
140140
return (mi_page_block_size(page) > MI_MEDIUM_OBJ_SIZE_MAX || mi_page_is_huge(page));
141141
}
142142

143-
static size_t mi_page_bin(const mi_page_t* page) {
143+
size_t _mi_page_bin(const mi_page_t* page) {
144144
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))));
145145
mi_assert_internal(bin <= MI_BIN_FULL);
146146
return bin;
147147
}
148148

149149
static mi_page_queue_t* mi_heap_page_queue_of(mi_heap_t* heap, const mi_page_t* page) {
150150
mi_assert_internal(heap!=NULL);
151-
const size_t bin = mi_page_bin(page);
151+
const size_t bin = _mi_page_bin(page);
152152
mi_page_queue_t* pq = &heap->pages[bin];
153153
mi_assert_internal((mi_page_block_size(page) == pq->block_size) ||
154154
(mi_page_is_large_or_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
@@ -291,7 +291,7 @@ static mi_page_t* mi_page_fresh_alloc(mi_heap_t* heap, mi_page_queue_t* pq, size
291291
mi_assert_internal(full_block_size >= block_size);
292292
mi_page_init(heap, page, full_block_size, heap->tld);
293293
mi_heap_stat_increase(heap, pages, 1);
294-
mi_heap_stat_increase(heap, page_bins[mi_page_bin(page)], 1);
294+
mi_heap_stat_increase(heap, page_bins[_mi_page_bin(page)], 1);
295295
if (pq != NULL) { mi_page_queue_push(heap, pq, page); }
296296
mi_assert_expensive(_mi_page_is_valid(page));
297297
return page;
@@ -445,8 +445,7 @@ void _mi_page_free(mi_page_t* page, mi_page_queue_t* pq, bool force) {
445445
mi_segments_tld_t* segments_tld = &heap->tld->segments;
446446
mi_page_queue_remove(pq, page);
447447

448-
// and free it
449-
mi_heap_stat_decrease(heap, page_bins[mi_page_bin(page)], 1);
448+
// and free it
450449
mi_page_set_heap(page,NULL);
451450
_mi_segment_page_free(page, force, segments_tld);
452451
}

src/segment.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,6 +1023,7 @@ static mi_slice_t* mi_segment_page_clear(mi_page_t* page, mi_segments_tld_t* tld
10231023
size_t inuse = page->capacity * mi_page_block_size(page);
10241024
_mi_stat_decrease(&tld->stats->page_committed, inuse);
10251025
_mi_stat_decrease(&tld->stats->pages, 1);
1026+
_mi_stat_decrease(&tld->stats->page_bins[_mi_page_bin(page)], 1);
10261027

10271028
// reset the page memory to reduce memory pressure?
10281029
if (segment->allow_decommit && mi_option_is_enabled(mi_option_deprecated_page_reset)) {

src/stats.c

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

400+
void _mi_stats_merge_thread(mi_tld_t* tld) {
401+
mi_stats_merge_from( &tld->stats );
402+
}
403+
400404
void _mi_stats_done(mi_stats_t* stats) { // called from `mi_thread_done`
401405
mi_stats_merge_from(stats);
402406
}
@@ -500,7 +504,7 @@ static bool mi_heap_buf_expand(mi_heap_buf_t* hbuf) {
500504
hbuf->buf[hbuf->size-1] = 0;
501505
}
502506
if (hbuf->size > SIZE_MAX/2 || !hbuf->can_realloc) return false;
503-
const size_t newsize = (hbuf->size == 0 ? 2*MI_KiB : 2*hbuf->size);
507+
const size_t newsize = (hbuf->size == 0 ? mi_good_size(12*MI_KiB) : 2*hbuf->size);
504508
char* const newbuf = (char*)mi_rezalloc(hbuf->buf, newsize);
505509
if (newbuf == NULL) return false;
506510
hbuf->buf = newbuf;

test/test-stress.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ int main(int argc, char** argv) {
343343
mi_free(json);
344344
}
345345
#endif
346+
mi_collect(true);
346347
mi_stats_print(NULL);
347348
#endif
348349
//bench_end_program();

0 commit comments

Comments
 (0)