@@ -1004,3 +1004,126 @@ TEST_P(CoarseWithMemoryStrategyTest,
10041004 umfMemoryProviderDestroy (coarse_memory_provider);
10051005 umfMemoryProviderDestroy (malloc_memory_provider);
10061006}
1007+
1008+ TEST_P (CoarseWithMemoryStrategyTest,
1009+ disjointCoarseMallocPool_purge_no_upstream) {
1010+ umf_result_t umf_result;
1011+
1012+ const size_t init_buffer_size = 20 * MB;
1013+
1014+ // Preallocate some memory
1015+ std::unique_ptr<char []> buffer (new char [init_buffer_size]);
1016+ void *buf = buffer.get ();
1017+ ASSERT_NE (buf, nullptr );
1018+ memset (buf, 0 , init_buffer_size);
1019+
1020+ coarse_memory_provider_params_t coarse_memory_provider_params;
1021+ // make sure there are no undefined members - prevent a UB
1022+ memset (&coarse_memory_provider_params, 0 ,
1023+ sizeof (coarse_memory_provider_params));
1024+ coarse_memory_provider_params.allocation_strategy = allocation_strategy;
1025+ coarse_memory_provider_params.upstream_memory_provider = nullptr ;
1026+ coarse_memory_provider_params.immediate_init_from_upstream = false ;
1027+ coarse_memory_provider_params.init_buffer = buf;
1028+ coarse_memory_provider_params.init_buffer_size = init_buffer_size;
1029+
1030+ umf_memory_provider_handle_t coarse_memory_provider = nullptr ;
1031+ umf_result = umfMemoryProviderCreate (umfCoarseMemoryProviderOps (),
1032+ &coarse_memory_provider_params,
1033+ &coarse_memory_provider);
1034+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
1035+ ASSERT_NE (coarse_memory_provider, nullptr );
1036+
1037+ // umfMemoryProviderPurgeLazy
1038+ // provider == NULL
1039+ umf_result = umfMemoryProviderPurgeLazy (nullptr , (void *)0x01 , 1 );
1040+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
1041+
1042+ // ptr == NULL
1043+ umf_result = umfMemoryProviderPurgeLazy (coarse_memory_provider, nullptr , 1 );
1044+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
1045+
1046+ // no upstream_memory_provider
1047+ umf_result =
1048+ umfMemoryProviderPurgeLazy (coarse_memory_provider, (void *)0x01 , 1 );
1049+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_NOT_SUPPORTED);
1050+
1051+ // umfMemoryProviderPurgeForce
1052+ // provider == NULL
1053+ umf_result = umfMemoryProviderPurgeForce (nullptr , (void *)0x01 , 1 );
1054+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
1055+
1056+ // ptr == NULL
1057+ umf_result =
1058+ umfMemoryProviderPurgeForce (coarse_memory_provider, nullptr , 1 );
1059+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
1060+
1061+ // no upstream_memory_provider
1062+ umf_result =
1063+ umfMemoryProviderPurgeForce (coarse_memory_provider, (void *)0x01 , 1 );
1064+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_NOT_SUPPORTED);
1065+
1066+ umfMemoryProviderDestroy (coarse_memory_provider);
1067+ }
1068+
1069+ TEST_P (CoarseWithMemoryStrategyTest,
1070+ disjointCoarseMallocPool_purge_with_upstream) {
1071+ umf_memory_provider_handle_t malloc_memory_provider;
1072+ umf_result_t umf_result;
1073+
1074+ umf_result = umfMemoryProviderCreate (&UMF_MALLOC_MEMORY_PROVIDER_OPS, NULL ,
1075+ &malloc_memory_provider);
1076+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
1077+ ASSERT_NE (malloc_memory_provider, nullptr );
1078+
1079+ const size_t init_buffer_size = 20 * MB;
1080+
1081+ coarse_memory_provider_params_t coarse_memory_provider_params;
1082+ // make sure there are no undefined members - prevent a UB
1083+ memset (&coarse_memory_provider_params, 0 ,
1084+ sizeof (coarse_memory_provider_params));
1085+ coarse_memory_provider_params.upstream_memory_provider =
1086+ malloc_memory_provider;
1087+ coarse_memory_provider_params.immediate_init_from_upstream = true ;
1088+ coarse_memory_provider_params.init_buffer = NULL ;
1089+ coarse_memory_provider_params.init_buffer_size = init_buffer_size;
1090+
1091+ umf_memory_provider_handle_t coarse_memory_provider;
1092+ umf_result = umfMemoryProviderCreate (umfCoarseMemoryProviderOps (),
1093+ &coarse_memory_provider_params,
1094+ &coarse_memory_provider);
1095+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
1096+ ASSERT_NE (coarse_memory_provider, nullptr );
1097+
1098+ // umfMemoryProviderPurgeLazy
1099+ // provider == NULL
1100+ umf_result = umfMemoryProviderPurgeLazy (nullptr , (void *)0x01 , 1 );
1101+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
1102+
1103+ // ptr == NULL
1104+ umf_result = umfMemoryProviderPurgeLazy (coarse_memory_provider, nullptr , 1 );
1105+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
1106+
1107+ // malloc_memory_provider returns UMF_RESULT_ERROR_UNKNOWN
1108+ umf_result =
1109+ umfMemoryProviderPurgeLazy (coarse_memory_provider, (void *)0x01 , 1 );
1110+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_UNKNOWN);
1111+
1112+ // umfMemoryProviderPurgeForce
1113+ // provider == NULL
1114+ umf_result = umfMemoryProviderPurgeForce (nullptr , (void *)0x01 , 1 );
1115+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
1116+
1117+ // ptr == NULL
1118+ umf_result =
1119+ umfMemoryProviderPurgeForce (coarse_memory_provider, nullptr , 1 );
1120+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
1121+
1122+ // malloc_memory_provider returns UMF_RESULT_ERROR_UNKNOWN
1123+ umf_result =
1124+ umfMemoryProviderPurgeForce (coarse_memory_provider, (void *)0x01 , 1 );
1125+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_UNKNOWN);
1126+
1127+ umfMemoryProviderDestroy (coarse_memory_provider);
1128+ umfMemoryProviderDestroy (malloc_memory_provider);
1129+ }
0 commit comments