Skip to content

Commit 3674f6f

Browse files
authored
Merge pull request #773 from ldorau/Move_free_to_optional_ext_provider_ops
Move free() to optional (ext) provider ops
2 parents 6a1424e + fa006ee commit 3674f6f

16 files changed

+52
-53
lines changed

examples/custom_file_provider/custom_file_provider.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,11 +251,11 @@ static umf_memory_provider_ops_t file_ops = {
251251
.initialize = file_init,
252252
.finalize = file_deinit,
253253
.alloc = file_alloc,
254-
.free = file_free,
255254
.get_name = file_get_name,
256255
.get_last_native_error = file_get_last_native_error,
257256
.get_recommended_page_size = file_get_recommended_page_size,
258257
.get_min_page_size = file_get_min_page_size,
258+
.ext.free = file_free,
259259
};
260260

261261
// Main function

include/umf/memory_provider_ops.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@ extern "C" {
2222
/// can keep them NULL.
2323
///
2424
typedef struct umf_memory_provider_ext_ops_t {
25+
///
26+
/// @brief Frees the memory space pointed by \p ptr from the memory \p provider
27+
/// @param provider pointer to the memory provider
28+
/// @param ptr pointer to the allocated memory to free
29+
/// @param size size of the allocation
30+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure
31+
///
32+
umf_result_t (*free)(void *provider, void *ptr, size_t size);
33+
2534
///
2635
/// @brief Discard physical pages within the virtual memory mapping associated at the given addr
2736
/// and \p size. This call is asynchronous and may delay purging the pages indefinitely.
@@ -172,15 +181,6 @@ typedef struct umf_memory_provider_ops_t {
172181
umf_result_t (*alloc)(void *provider, size_t size, size_t alignment,
173182
void **ptr);
174183

175-
///
176-
/// @brief Frees the memory space pointed by \p ptr from the memory \p provider
177-
/// @param provider pointer to the memory provider
178-
/// @param ptr pointer to the allocated memory to free
179-
/// @param size size of the allocation
180-
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure
181-
///
182-
umf_result_t (*free)(void *provider, void *ptr, size_t size);
183-
184184
///
185185
/// @brief Retrieve string representation of the underlying provider specific
186186
/// result reported by the last API that returned

src/cpp_helpers.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ template <typename T> umf_memory_provider_ops_t providerOpsBase() {
8484
ops.version = UMF_VERSION_CURRENT;
8585
ops.finalize = [](void *obj) { delete reinterpret_cast<T *>(obj); };
8686
UMF_ASSIGN_OP(ops, T, alloc, UMF_RESULT_ERROR_UNKNOWN);
87-
UMF_ASSIGN_OP(ops, T, free, UMF_RESULT_ERROR_UNKNOWN);
87+
UMF_ASSIGN_OP(ops.ext, T, free, UMF_RESULT_ERROR_UNKNOWN);
8888
UMF_ASSIGN_OP_NORETURN(ops, T, get_last_native_error);
8989
UMF_ASSIGN_OP(ops, T, get_recommended_page_size, UMF_RESULT_ERROR_UNKNOWN);
9090
UMF_ASSIGN_OP(ops, T, get_min_page_size, UMF_RESULT_ERROR_UNKNOWN);

src/memory_pool.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ static umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,
4343
if (!(flags & UMF_POOL_CREATE_FLAG_DISABLE_TRACKING)) {
4444
// Wrap provider with memory tracking provider.
4545
// Check if the provider supports the free() operation.
46-
bool upstreamDoesNotFree = (umfMemoryProviderFree(provider, NULL, 0) ==
47-
UMF_RESULT_ERROR_NOT_SUPPORTED);
46+
bool upstreamDoesNotFree = umfIsFreeOpDefault(provider);
4847
ret = umfTrackingMemoryProviderCreate(provider, pool, &pool->provider,
4948
upstreamDoesNotFree);
5049
if (ret != UMF_RESULT_SUCCESS) {

src/memory_provider.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ typedef struct umf_memory_provider_t {
2525
void *provider_priv;
2626
} umf_memory_provider_t;
2727

28+
static umf_result_t umfDefaultFree(void *provider, void *ptr, size_t size) {
29+
(void)provider;
30+
(void)ptr;
31+
(void)size;
32+
return UMF_RESULT_ERROR_NOT_SUPPORTED;
33+
}
34+
2835
static umf_result_t umfDefaultPurgeLazy(void *provider, void *ptr,
2936
size_t size) {
3037
(void)provider;
@@ -99,6 +106,9 @@ static umf_result_t umfDefaultCloseIPCHandle(void *provider, void *ptr,
99106
}
100107

101108
void assignOpsExtDefaults(umf_memory_provider_ops_t *ops) {
109+
if (!ops->ext.free) {
110+
ops->ext.free = umfDefaultFree;
111+
}
102112
if (!ops->ext.purge_lazy) {
103113
ops->ext.purge_lazy = umfDefaultPurgeLazy;
104114
}
@@ -133,7 +143,7 @@ void assignOpsIpcDefaults(umf_memory_provider_ops_t *ops) {
133143

134144
static bool validateOpsMandatory(const umf_memory_provider_ops_t *ops) {
135145
// Mandatory ops should be non-NULL
136-
return ops->alloc && ops->free && ops->get_recommended_page_size &&
146+
return ops->alloc && ops->get_recommended_page_size &&
137147
ops->get_min_page_size && ops->initialize && ops->finalize &&
138148
ops->get_last_native_error && ops->get_name;
139149
}
@@ -159,6 +169,10 @@ static bool validateOps(const umf_memory_provider_ops_t *ops) {
159169
validateOpsIpc(&(ops->ipc));
160170
}
161171

172+
bool umfIsFreeOpDefault(umf_memory_provider_handle_t hProvider) {
173+
return (hProvider->ops.ext.free == umfDefaultFree);
174+
}
175+
162176
umf_result_t umfMemoryProviderCreate(const umf_memory_provider_ops_t *ops,
163177
void *params,
164178
umf_memory_provider_handle_t *hProvider) {
@@ -219,7 +233,8 @@ umf_result_t umfMemoryProviderAlloc(umf_memory_provider_handle_t hProvider,
219233
umf_result_t umfMemoryProviderFree(umf_memory_provider_handle_t hProvider,
220234
void *ptr, size_t size) {
221235
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
222-
umf_result_t res = hProvider->ops.free(hProvider->provider_priv, ptr, size);
236+
umf_result_t res =
237+
hProvider->ops.ext.free(hProvider->provider_priv, ptr, size);
223238
checkErrorAndSetLastProvider(res, hProvider);
224239
return res;
225240
}

src/memory_provider_internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
#ifndef UMF_MEMORY_PROVIDER_INTERNAL_H
1111
#define UMF_MEMORY_PROVIDER_INTERNAL_H 1
1212

13+
#include <stdbool.h>
14+
1315
#include <umf/memory_provider.h>
1416

1517
#ifdef __cplusplus
@@ -18,6 +20,7 @@ extern "C" {
1820

1921
void *umfMemoryProviderGetPriv(umf_memory_provider_handle_t hProvider);
2022
umf_memory_provider_handle_t *umfGetLastFailedMemoryProviderPtr(void);
23+
bool umfIsFreeOpDefault(umf_memory_provider_handle_t hProvider);
2124

2225
#ifdef __cplusplus
2326
}

src/provider/provider_cuda.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,11 +348,11 @@ static struct umf_memory_provider_ops_t UMF_CUDA_MEMORY_PROVIDER_OPS = {
348348
.initialize = cu_memory_provider_initialize,
349349
.finalize = cu_memory_provider_finalize,
350350
.alloc = cu_memory_provider_alloc,
351-
.free = cu_memory_provider_free,
352351
.get_last_native_error = cu_memory_provider_get_last_native_error,
353352
.get_recommended_page_size = cu_memory_provider_get_recommended_page_size,
354353
.get_min_page_size = cu_memory_provider_get_min_page_size,
355354
.get_name = cu_memory_provider_get_name,
355+
.ext.free = cu_memory_provider_free,
356356
// TODO
357357
/*
358358
.ext.purge_lazy = cu_memory_provider_purge_lazy,

src/provider/provider_devdax_memory.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -247,15 +247,6 @@ static umf_result_t devdax_alloc(void *provider, size_t size, size_t alignment,
247247
return UMF_RESULT_SUCCESS;
248248
}
249249

250-
// free() is not supported
251-
static umf_result_t devdax_free(void *provider, void *ptr, size_t size) {
252-
(void)provider; // unused
253-
(void)ptr; // unused
254-
(void)size; // unused
255-
256-
return UMF_RESULT_ERROR_NOT_SUPPORTED;
257-
}
258-
259250
static void devdax_get_last_native_error(void *provider, const char **ppMessage,
260251
int32_t *pError) {
261252
(void)provider; // unused
@@ -520,7 +511,6 @@ static umf_memory_provider_ops_t UMF_DEVDAX_MEMORY_PROVIDER_OPS = {
520511
.initialize = devdax_initialize,
521512
.finalize = devdax_finalize,
522513
.alloc = devdax_alloc,
523-
.free = devdax_free,
524514
.get_last_native_error = devdax_get_last_native_error,
525515
.get_recommended_page_size = devdax_get_recommended_page_size,
526516
.get_min_page_size = devdax_get_min_page_size,

src/provider/provider_file_memory.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -392,15 +392,6 @@ static umf_result_t file_alloc(void *provider, size_t size, size_t alignment,
392392
return UMF_RESULT_SUCCESS;
393393
}
394394

395-
// free() is not supported
396-
static umf_result_t file_free(void *provider, void *ptr, size_t size) {
397-
(void)provider; // unused
398-
(void)ptr; // unused
399-
(void)size; // unused
400-
401-
return UMF_RESULT_ERROR_NOT_SUPPORTED;
402-
}
403-
404395
static void file_get_last_native_error(void *provider, const char **ppMessage,
405396
int32_t *pError) {
406397
(void)provider; // unused
@@ -688,7 +679,6 @@ static umf_memory_provider_ops_t UMF_FILE_MEMORY_PROVIDER_OPS = {
688679
.initialize = file_initialize,
689680
.finalize = file_finalize,
690681
.alloc = file_alloc,
691-
.free = file_free,
692682
.get_last_native_error = file_get_last_native_error,
693683
.get_recommended_page_size = file_get_recommended_page_size,
694684
.get_min_page_size = file_get_min_page_size,

src/provider/provider_level_zero.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -545,11 +545,11 @@ static struct umf_memory_provider_ops_t UMF_LEVEL_ZERO_MEMORY_PROVIDER_OPS = {
545545
.initialize = ze_memory_provider_initialize,
546546
.finalize = ze_memory_provider_finalize,
547547
.alloc = ze_memory_provider_alloc,
548-
.free = ze_memory_provider_free,
549548
.get_last_native_error = ze_memory_provider_get_last_native_error,
550549
.get_recommended_page_size = ze_memory_provider_get_recommended_page_size,
551550
.get_min_page_size = ze_memory_provider_get_min_page_size,
552551
.get_name = ze_memory_provider_get_name,
552+
.ext.free = ze_memory_provider_free,
553553
.ext.purge_lazy = ze_memory_provider_purge_lazy,
554554
.ext.purge_force = ze_memory_provider_purge_force,
555555
.ext.allocation_merge = ze_memory_provider_allocation_merge,

src/provider/provider_os_memory.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1311,11 +1311,11 @@ static umf_memory_provider_ops_t UMF_OS_MEMORY_PROVIDER_OPS = {
13111311
.initialize = os_initialize,
13121312
.finalize = os_finalize,
13131313
.alloc = os_alloc,
1314-
.free = os_free,
13151314
.get_last_native_error = os_get_last_native_error,
13161315
.get_recommended_page_size = os_get_recommended_page_size,
13171316
.get_min_page_size = os_get_min_page_size,
13181317
.get_name = os_get_name,
1318+
.ext.free = os_free,
13191319
.ext.purge_lazy = os_purge_lazy,
13201320
.ext.purge_force = os_purge_force,
13211321
.ext.allocation_merge = os_allocation_merge,

src/provider/provider_tracking.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -665,11 +665,11 @@ umf_memory_provider_ops_t UMF_TRACKING_MEMORY_PROVIDER_OPS = {
665665
.initialize = trackingInitialize,
666666
.finalize = trackingFinalize,
667667
.alloc = trackingAlloc,
668-
.free = trackingFree,
669668
.get_last_native_error = trackingGetLastError,
670669
.get_min_page_size = trackingGetMinPageSize,
671670
.get_recommended_page_size = trackingGetRecommendedPageSize,
672671
.get_name = trackingName,
672+
.ext.free = trackingFree,
673673
.ext.purge_force = trackingPurgeForce,
674674
.ext.purge_lazy = trackingPurgeLazy,
675675
.ext.allocation_split = trackingAllocationSplit,

test/common/provider_null.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,11 @@ umf_memory_provider_ops_t UMF_NULL_PROVIDER_OPS = {
134134
.initialize = nullInitialize,
135135
.finalize = nullFinalize,
136136
.alloc = nullAlloc,
137-
.free = nullFree,
138137
.get_last_native_error = nullGetLastError,
139138
.get_recommended_page_size = nullGetRecommendedPageSize,
140139
.get_min_page_size = nullGetPageSize,
141140
.get_name = nullName,
141+
.ext.free = nullFree,
142142
.ext.purge_lazy = nullPurgeLazy,
143143
.ext.purge_force = nullPurgeForce,
144144
.ext.allocation_merge = nullAllocationMerge,

test/common/provider_trace.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,11 +195,11 @@ umf_memory_provider_ops_t UMF_TRACE_PROVIDER_OPS = {
195195
.initialize = traceInitialize,
196196
.finalize = traceFinalize,
197197
.alloc = traceAlloc,
198-
.free = traceFree,
199198
.get_last_native_error = traceGetLastError,
200199
.get_recommended_page_size = traceGetRecommendedPageSize,
201200
.get_min_page_size = traceGetPageSize,
202201
.get_name = traceName,
202+
.ext.free = traceFree,
203203
.ext.purge_lazy = tracePurgeLazy,
204204
.ext.purge_force = tracePurgeForce,
205205
.ext.allocation_merge = traceAllocationMerge,

test/memoryProviderAPI.cpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,19 @@ TEST_F(test, memoryProviderTrace) {
8686
ASSERT_EQ(calls.size(), ++call_count);
8787
}
8888

89+
TEST_F(test, memoryProviderOpsNullFreeField) {
90+
umf_memory_provider_ops_t provider_ops = UMF_NULL_PROVIDER_OPS;
91+
provider_ops.ext.free = nullptr;
92+
umf_memory_provider_handle_t hProvider;
93+
auto ret = umfMemoryProviderCreate(&provider_ops, nullptr, &hProvider);
94+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
95+
96+
ret = umfMemoryProviderFree(hProvider, nullptr, 0);
97+
ASSERT_EQ(ret, UMF_RESULT_ERROR_NOT_SUPPORTED);
98+
99+
umfMemoryProviderDestroy(hProvider);
100+
}
101+
89102
TEST_F(test, memoryProviderOpsNullPurgeLazyField) {
90103
umf_memory_provider_ops_t provider_ops = UMF_NULL_PROVIDER_OPS;
91104
provider_ops.ext.purge_lazy = nullptr;
@@ -155,14 +168,6 @@ TEST_F(test, memoryProviderOpsNullAllocField) {
155168
ASSERT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
156169
}
157170

158-
TEST_F(test, memoryProviderOpsNullFreeField) {
159-
umf_memory_provider_ops_t provider_ops = UMF_NULL_PROVIDER_OPS;
160-
provider_ops.free = nullptr;
161-
umf_memory_provider_handle_t hProvider;
162-
auto ret = umfMemoryProviderCreate(&provider_ops, nullptr, &hProvider);
163-
ASSERT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
164-
}
165-
166171
TEST_F(test, memoryProviderOpsNullGetLastNativeErrorField) {
167172
umf_memory_provider_ops_t provider_ops = UMF_NULL_PROVIDER_OPS;
168173
provider_ops.get_last_native_error = nullptr;

test/pools/disjoint_pool.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,7 @@ TEST_F(test, sharedLimits) {
8282
}
8383
umf_result_t free(void *ptr, [[maybe_unused]] size_t size) noexcept {
8484
::free(ptr);
85-
// umfMemoryProviderFree(provider, NULL, 0) is called inside umfPoolCreateInternal()
86-
if (ptr != NULL && size != 0) {
87-
numFrees++;
88-
}
85+
numFrees++;
8986
return UMF_RESULT_SUCCESS;
9087
}
9188
};

0 commit comments

Comments
 (0)