Skip to content

Commit e060b6d

Browse files
Merge pull request #780 from ldorau/Implement_purge_lazy_force_API_of_the_Coarse_provider
Implement purge_lazy/_force() API of the Coarse provider
2 parents 8e0ec14 + c878ed4 commit e060b6d

File tree

2 files changed

+159
-2
lines changed

2 files changed

+159
-2
lines changed

src/provider/provider_coarse.c

+36-2
Original file line numberDiff line numberDiff line change
@@ -1535,6 +1535,40 @@ coarse_memory_provider_get_stats(void *provider,
15351535
return UMF_RESULT_SUCCESS;
15361536
}
15371537

1538+
static umf_result_t coarse_memory_provider_purge_lazy(void *provider, void *ptr,
1539+
size_t size) {
1540+
if (provider == NULL || ptr == NULL) {
1541+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
1542+
}
1543+
1544+
coarse_memory_provider_t *coarse_provider =
1545+
(struct coarse_memory_provider_t *)provider;
1546+
if (coarse_provider->upstream_memory_provider == NULL) {
1547+
LOG_ERR("no upstream memory provider given");
1548+
return UMF_RESULT_ERROR_NOT_SUPPORTED;
1549+
}
1550+
1551+
return umfMemoryProviderPurgeLazy(coarse_provider->upstream_memory_provider,
1552+
ptr, size);
1553+
}
1554+
1555+
static umf_result_t coarse_memory_provider_purge_force(void *provider,
1556+
void *ptr, size_t size) {
1557+
if (provider == NULL || ptr == NULL) {
1558+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
1559+
}
1560+
1561+
coarse_memory_provider_t *coarse_provider =
1562+
(struct coarse_memory_provider_t *)provider;
1563+
if (coarse_provider->upstream_memory_provider == NULL) {
1564+
LOG_ERR("no upstream memory provider given");
1565+
return UMF_RESULT_ERROR_NOT_SUPPORTED;
1566+
}
1567+
1568+
return umfMemoryProviderPurgeForce(
1569+
coarse_provider->upstream_memory_provider, ptr, size);
1570+
}
1571+
15381572
static umf_result_t coarse_memory_provider_allocation_split(void *provider,
15391573
void *ptr,
15401574
size_t totalSize,
@@ -1719,12 +1753,12 @@ umf_memory_provider_ops_t UMF_COARSE_MEMORY_PROVIDER_OPS = {
17191753
.get_min_page_size = coarse_memory_provider_get_min_page_size,
17201754
.get_name = coarse_memory_provider_get_name,
17211755
.ext.free = coarse_memory_provider_free,
1756+
.ext.purge_lazy = coarse_memory_provider_purge_lazy,
1757+
.ext.purge_force = coarse_memory_provider_purge_force,
17221758
.ext.allocation_merge = coarse_memory_provider_allocation_merge,
17231759
.ext.allocation_split = coarse_memory_provider_allocation_split,
17241760
// TODO
17251761
/*
1726-
.ext.purge_lazy = coarse_memory_provider_purge_lazy,
1727-
.ext.purge_force = coarse_memory_provider_purge_force,
17281762
.ipc.get_ipc_handle_size = coarse_memory_provider_get_ipc_handle_size,
17291763
.ipc.get_ipc_handle = coarse_memory_provider_get_ipc_handle,
17301764
.ipc.put_ipc_handle = coarse_memory_provider_put_ipc_handle,

test/disjointCoarseMallocPool.cpp

+123
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)