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,

0 commit comments

Comments
 (0)