@@ -37,7 +37,7 @@ static inline mi_block_t* mi_page_block_at(const mi_page_t* page, void* page_sta
3737}
3838
3939static 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 );
4141
4242#if (MI_DEBUG >=3 )
4343static 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
630630// Note: we also experimented with "bump" allocation on the first
631631// allocations but this did not speed up any benchmark (due to an
632632// 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 ) {
634634 mi_assert_expensive (mi_page_is_valid_init (page ));
635635 #if (MI_SECURE <=2 )
636636 mi_assert (page -> free == NULL );
637637 mi_assert (page -> local_free == NULL );
638- if (page -> free != NULL ) return ;
638+ if (page -> free != NULL ) return true ;
639639 #endif
640- if (page -> capacity >= page -> reserved ) return ;
640+ if (page -> capacity >= page -> reserved ) return true ;
641641
642642 size_t page_size ;
643643 //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)
673673 page -> capacity += (uint16_t )extend ;
674674 mi_stat_increase (tld -> stats .page_committed , extend * bsize );
675675 mi_assert_expensive (mi_page_is_valid_init (page ));
676+ return true;
676677}
677678
678679// 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
724725 mi_assert_expensive (mi_page_is_valid_init (page ));
725726
726727 // 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 ;
729732}
730733
731734
@@ -817,9 +820,14 @@ static mi_page_t* mi_page_queue_find_free_ex(mi_heap_t* heap, mi_page_queue_t* p
817820 if (page_candidate != NULL ) {
818821 page = page_candidate ;
819822 }
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 ));
823831 }
824832
825833 if (page == NULL ) {
0 commit comments