@@ -37,7 +37,7 @@ static inline mi_block_t* mi_page_block_at(const mi_page_t* page, void* page_sta
37
37
}
38
38
39
39
static void mi_page_init (mi_heap_t * heap , mi_page_t * page , size_t size , mi_tld_t * tld );
40
- static void mi_page_extend_free (mi_heap_t * heap , mi_page_t * page , mi_tld_t * tld );
40
+ static bool mi_page_extend_free (mi_heap_t * heap , mi_page_t * page , mi_tld_t * tld );
41
41
42
42
#if (MI_DEBUG >=3 )
43
43
static size_t mi_page_list_count (mi_page_t * page , mi_block_t * head ) {
@@ -630,14 +630,14 @@ static mi_decl_noinline void mi_page_free_list_extend( mi_page_t* const page, co
630
630
// Note: we also experimented with "bump" allocation on the first
631
631
// allocations but this did not speed up any benchmark (due to an
632
632
// extra test in malloc? or cache effects?)
633
- static void mi_page_extend_free (mi_heap_t * heap , mi_page_t * page , mi_tld_t * tld ) {
633
+ static bool mi_page_extend_free (mi_heap_t * heap , mi_page_t * page , mi_tld_t * tld ) {
634
634
mi_assert_expensive (mi_page_is_valid_init (page ));
635
635
#if (MI_SECURE <=2 )
636
636
mi_assert (page -> free == NULL );
637
637
mi_assert (page -> local_free == NULL );
638
- if (page -> free != NULL ) return ;
638
+ if (page -> free != NULL ) return true ;
639
639
#endif
640
- if (page -> capacity >= page -> reserved ) return ;
640
+ if (page -> capacity >= page -> reserved ) return true ;
641
641
642
642
size_t page_size ;
643
643
//uint8_t* page_start =
@@ -673,6 +673,7 @@ static void mi_page_extend_free(mi_heap_t* heap, mi_page_t* page, mi_tld_t* tld)
673
673
page -> capacity += (uint16_t )extend ;
674
674
mi_stat_increase (tld -> stats .page_committed , extend * bsize );
675
675
mi_assert_expensive (mi_page_is_valid_init (page ));
676
+ return true;
676
677
}
677
678
678
679
// Initialize a fresh page
@@ -724,8 +725,10 @@ static void mi_page_init(mi_heap_t* heap, mi_page_t* page, size_t block_size, mi
724
725
mi_assert_expensive (mi_page_is_valid_init (page ));
725
726
726
727
// initialize an initial free list
727
- mi_page_extend_free (heap ,page ,tld );
728
- mi_assert (mi_page_immediate_available (page ));
728
+ if (mi_page_extend_free (heap ,page ,tld )) {
729
+ mi_assert (mi_page_immediate_available (page ));
730
+ }
731
+ return ;
729
732
}
730
733
731
734
@@ -817,9 +820,14 @@ static mi_page_t* mi_page_queue_find_free_ex(mi_heap_t* heap, mi_page_queue_t* p
817
820
if (page_candidate != NULL ) {
818
821
page = page_candidate ;
819
822
}
820
- if (page != NULL && !mi_page_immediate_available (page )) {
821
- mi_assert_internal (mi_page_is_expandable (page ));
822
- mi_page_extend_free (heap , page , heap -> tld );
823
+ if (page != NULL ) {
824
+ if (!mi_page_immediate_available (page )) {
825
+ mi_assert_internal (mi_page_is_expandable (page ));
826
+ if (!mi_page_extend_free (heap , page , heap -> tld )) {
827
+ page = NULL ; // failed to extend
828
+ }
829
+ }
830
+ mi_assert_internal (page == NULL || mi_page_immediate_available (page ));
823
831
}
824
832
825
833
if (page == NULL ) {
0 commit comments