@@ -588,12 +588,6 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
588
588
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
589
589
}
590
590
591
- disjoint_pool_t * disjoint_pool =
592
- umf_ba_global_alloc (sizeof (* disjoint_pool ));
593
- if (!disjoint_pool ) {
594
- return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
595
- }
596
-
597
591
umf_disjoint_pool_params_t * dp_params =
598
592
(umf_disjoint_pool_params_t * )params ;
599
593
@@ -604,12 +598,21 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
604
598
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
605
599
}
606
600
601
+ disjoint_pool_t * disjoint_pool =
602
+ umf_ba_global_alloc (sizeof (* disjoint_pool ));
603
+ if (disjoint_pool == NULL ) {
604
+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
605
+ }
606
+
607
607
VALGRIND_DO_CREATE_MEMPOOL (disjoint_pool , 0 , 0 );
608
608
609
609
disjoint_pool -> provider = provider ;
610
610
disjoint_pool -> params = * dp_params ;
611
611
612
612
disjoint_pool -> known_slabs = critnib_new ();
613
+ if (disjoint_pool -> known_slabs == NULL ) {
614
+ goto err_free_disjoint_pool ;
615
+ }
613
616
614
617
// Generate buckets sized such as: 64, 96, 128, 192, ..., CutOff.
615
618
// Powers of 2 and the value halfway between the powers of 2.
@@ -625,6 +628,9 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
625
628
disjoint_pool -> min_bucket_size_exp = (size_t )log2Utils (Size1 );
626
629
disjoint_pool -> default_shared_limits =
627
630
umfDisjointPoolSharedLimitsCreate (SIZE_MAX );
631
+ if (disjoint_pool -> default_shared_limits == NULL ) {
632
+ goto err_free_known_slabs ;
633
+ }
628
634
629
635
// count number of buckets, start from 1
630
636
disjoint_pool -> buckets_num = 1 ;
@@ -633,10 +639,14 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
633
639
for (; Size2 < CutOff ; Size1 *= 2 , Size2 *= 2 ) {
634
640
disjoint_pool -> buckets_num += 2 ;
635
641
}
642
+
636
643
disjoint_pool -> buckets = umf_ba_global_alloc (
637
644
sizeof (* disjoint_pool -> buckets ) * disjoint_pool -> buckets_num );
645
+ if (disjoint_pool -> buckets == NULL ) {
646
+ goto err_free_shared_limits ;
647
+ }
638
648
639
- int i = 0 ;
649
+ size_t i = 0 ;
640
650
Size1 = ts1 ;
641
651
Size2 = ts2 ;
642
652
for (; Size2 < CutOff ; Size1 *= 2 , Size2 *= 2 , i += 2 ) {
@@ -648,6 +658,13 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
648
658
disjoint_pool -> buckets [i ] = create_bucket (
649
659
CutOff , disjoint_pool , disjoint_pool_get_limits (disjoint_pool ));
650
660
661
+ // check if all buckets were created successfully
662
+ for (i = 0 ; i < disjoint_pool -> buckets_num ; i ++ ) {
663
+ if (disjoint_pool -> buckets [i ] == NULL ) {
664
+ goto err_free_buckets ;
665
+ }
666
+ }
667
+
651
668
umf_result_t ret = umfMemoryProviderGetMinPageSize (
652
669
provider , NULL , & disjoint_pool -> provider_min_page_size );
653
670
if (ret != UMF_RESULT_SUCCESS ) {
@@ -657,6 +674,25 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
657
674
* ppPool = (void * )disjoint_pool ;
658
675
659
676
return UMF_RESULT_SUCCESS ;
677
+
678
+ err_free_buckets :
679
+ for (i = 0 ; i < disjoint_pool -> buckets_num ; i ++ ) {
680
+ if (disjoint_pool -> buckets [i ] != NULL ) {
681
+ destroy_bucket (disjoint_pool -> buckets [i ]);
682
+ }
683
+ }
684
+ umf_ba_global_free (disjoint_pool -> buckets );
685
+
686
+ err_free_shared_limits :
687
+ umfDisjointPoolSharedLimitsDestroy (disjoint_pool -> default_shared_limits );
688
+
689
+ err_free_known_slabs :
690
+ critnib_delete (disjoint_pool -> known_slabs );
691
+
692
+ err_free_disjoint_pool :
693
+ umf_ba_global_free (disjoint_pool );
694
+
695
+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
660
696
}
661
697
662
698
void * disjoint_pool_malloc (void * pool , size_t size ) {
0 commit comments