@@ -37,7 +37,7 @@ static inline mi_block_t* mi_page_block_at(const mi_page_t* page, void* page_sta
3737}
3838
3939//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 );
40+ static bool mi_page_extend_free (mi_heap_t * heap , mi_page_t * page );
4141
4242#if (MI_DEBUG >=3 )
4343static size_t mi_page_list_count (mi_page_t * page , mi_block_t * head ) {
@@ -605,14 +605,14 @@ static mi_decl_noinline void mi_page_free_list_extend( mi_page_t* const page, co
605605// Note: we also experimented with "bump" allocation on the first
606606// allocations but this did not speed up any benchmark (due to an
607607// extra test in malloc? or cache effects?)
608- static void mi_page_extend_free (mi_heap_t * heap , mi_page_t * page ) {
608+ static bool mi_page_extend_free (mi_heap_t * heap , mi_page_t * page ) {
609609 mi_assert_expensive (mi_page_is_valid_init (page ));
610610 #if (MI_SECURE < 3 )
611611 mi_assert (page -> free == NULL );
612612 mi_assert (page -> local_free == NULL );
613- if (page -> free != NULL ) return ;
613+ if (page -> free != NULL ) return true ;
614614 #endif
615- if (page -> capacity >= page -> reserved ) return ;
615+ if (page -> capacity >= page -> reserved ) return true ;
616616
617617 size_t page_size ;
618618 //uint8_t* page_start =
@@ -645,7 +645,9 @@ static void mi_page_extend_free(mi_heap_t* heap, mi_page_t* page) {
645645 const size_t needed_commit = _mi_align_up ( mi_page_slice_offset_of (page , needed_size ), MI_PAGE_MIN_COMMIT_SIZE );
646646 if (needed_commit > page -> slice_committed ) {
647647 mi_assert_internal (((needed_commit - page -> slice_committed ) % _mi_os_page_size ()) == 0 );
648- _mi_os_commit (mi_page_slice_start (page ) + page -> slice_committed , needed_commit - page -> slice_committed , NULL );
648+ if (!_mi_os_commit (mi_page_slice_start (page ) + page -> slice_committed , needed_commit - page -> slice_committed , NULL )) {
649+ return false;
650+ }
649651 page -> slice_committed = needed_commit ;
650652 }
651653 }
@@ -663,10 +665,11 @@ static void mi_page_extend_free(mi_heap_t* heap, mi_page_t* page) {
663665 mi_heap_stat_increase (heap , page_committed , extend * bsize );
664666 #endif
665667 mi_assert_expensive (mi_page_is_valid_init (page ));
668+ return true;
666669}
667670
668671// Initialize a fresh page (that is already partially initialized)
669- void _mi_page_init (mi_heap_t * heap , mi_page_t * page ) {
672+ mi_decl_nodiscard bool _mi_page_init (mi_heap_t * heap , mi_page_t * page ) {
670673 mi_assert (page != NULL );
671674 mi_page_set_heap (page , heap );
672675
@@ -703,8 +706,9 @@ void _mi_page_init(mi_heap_t* heap, mi_page_t* page) {
703706 mi_assert_expensive (mi_page_is_valid_init (page ));
704707
705708 // initialize an initial free list
706- mi_page_extend_free (heap ,page );
709+ if (! mi_page_extend_free (heap ,page )) return false ;
707710 mi_assert (mi_page_immediate_available (page ));
711+ return true;
708712}
709713
710714
@@ -794,9 +798,11 @@ static mi_decl_noinline mi_page_t* mi_page_queue_find_free_ex(mi_heap_t* heap, m
794798 if (page != NULL ) {
795799 if (!mi_page_immediate_available (page )) {
796800 mi_assert_internal (mi_page_is_expandable (page ));
797- mi_page_extend_free (heap , page );
801+ if (!mi_page_extend_free (heap , page )) {
802+ page = NULL ; // failed to extend
803+ }
798804 }
799- mi_assert_internal (mi_page_immediate_available (page ));
805+ mi_assert_internal (page == NULL || mi_page_immediate_available (page ));
800806 }
801807
802808 if (page == NULL ) {
0 commit comments