@@ -577,12 +577,6 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
577
577
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
578
578
}
579
579
580
- disjoint_pool_t * disjoint_pool =
581
- umf_ba_global_alloc (sizeof (* disjoint_pool ));
582
- if (!disjoint_pool ) {
583
- return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
584
- }
585
-
586
580
umf_disjoint_pool_params_t * dp_params =
587
581
(umf_disjoint_pool_params_t * )params ;
588
582
@@ -593,12 +587,21 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
593
587
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
594
588
}
595
589
590
+ disjoint_pool_t * disjoint_pool =
591
+ umf_ba_global_alloc (sizeof (* disjoint_pool ));
592
+ if (disjoint_pool == NULL ) {
593
+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
594
+ }
595
+
596
596
VALGRIND_DO_CREATE_MEMPOOL (disjoint_pool , 0 , 0 );
597
597
598
598
disjoint_pool -> provider = provider ;
599
599
disjoint_pool -> params = * dp_params ;
600
600
601
601
disjoint_pool -> known_slabs = critnib_new ();
602
+ if (disjoint_pool -> known_slabs == NULL ) {
603
+ goto err_free_disjoint_pool ;
604
+ }
602
605
603
606
// Generate buckets sized such as: 64, 96, 128, 192, ..., CutOff.
604
607
// Powers of 2 and the value halfway between the powers of 2.
@@ -614,6 +617,9 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
614
617
disjoint_pool -> min_bucket_size_exp = (size_t )utils_msb64 (Size1 );
615
618
disjoint_pool -> default_shared_limits =
616
619
umfDisjointPoolSharedLimitsCreate (SIZE_MAX );
620
+ if (disjoint_pool -> default_shared_limits == NULL ) {
621
+ goto err_free_known_slabs ;
622
+ }
617
623
618
624
// count number of buckets, start from 1
619
625
disjoint_pool -> buckets_num = 1 ;
@@ -622,10 +628,14 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
622
628
for (; Size2 < CutOff ; Size1 *= 2 , Size2 *= 2 ) {
623
629
disjoint_pool -> buckets_num += 2 ;
624
630
}
631
+
625
632
disjoint_pool -> buckets = umf_ba_global_alloc (
626
633
sizeof (* disjoint_pool -> buckets ) * disjoint_pool -> buckets_num );
634
+ if (disjoint_pool -> buckets == NULL ) {
635
+ goto err_free_shared_limits ;
636
+ }
627
637
628
- int i = 0 ;
638
+ size_t i = 0 ;
629
639
Size1 = ts1 ;
630
640
Size2 = ts2 ;
631
641
for (; Size2 < CutOff ; Size1 *= 2 , Size2 *= 2 , i += 2 ) {
@@ -637,6 +647,13 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
637
647
disjoint_pool -> buckets [i ] = create_bucket (
638
648
CutOff , disjoint_pool , disjoint_pool_get_limits (disjoint_pool ));
639
649
650
+ // check if all buckets were created successfully
651
+ for (i = 0 ; i < disjoint_pool -> buckets_num ; i ++ ) {
652
+ if (disjoint_pool -> buckets [i ] == NULL ) {
653
+ goto err_free_buckets ;
654
+ }
655
+ }
656
+
640
657
umf_result_t ret = umfMemoryProviderGetMinPageSize (
641
658
provider , NULL , & disjoint_pool -> provider_min_page_size );
642
659
if (ret != UMF_RESULT_SUCCESS ) {
@@ -646,6 +663,25 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
646
663
* ppPool = (void * )disjoint_pool ;
647
664
648
665
return UMF_RESULT_SUCCESS ;
666
+
667
+ err_free_buckets :
668
+ for (i = 0 ; i < disjoint_pool -> buckets_num ; i ++ ) {
669
+ if (disjoint_pool -> buckets [i ] != NULL ) {
670
+ destroy_bucket (disjoint_pool -> buckets [i ]);
671
+ }
672
+ }
673
+ umf_ba_global_free (disjoint_pool -> buckets );
674
+
675
+ err_free_shared_limits :
676
+ umfDisjointPoolSharedLimitsDestroy (disjoint_pool -> default_shared_limits );
677
+
678
+ err_free_known_slabs :
679
+ critnib_delete (disjoint_pool -> known_slabs );
680
+
681
+ err_free_disjoint_pool :
682
+ umf_ba_global_free (disjoint_pool );
683
+
684
+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
649
685
}
650
686
651
687
void * disjoint_pool_malloc (void * pool , size_t size ) {
0 commit comments