@@ -1004,3 +1004,126 @@ TEST_P(CoarseWithMemoryStrategyTest,
1004
1004
umfMemoryProviderDestroy (coarse_memory_provider);
1005
1005
umfMemoryProviderDestroy (malloc_memory_provider);
1006
1006
}
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