Skip to content

Commit 7e513bc

Browse files
committed
unify return values for destroy functions
fixes: #1217
1 parent 370c281 commit 7e513bc

34 files changed

+224
-95
lines changed

include/umf/memory_pool.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ umf_result_t umfPoolCreate(const umf_memory_pool_ops_t *ops,
5858
///
5959
/// @brief Destroys memory pool.
6060
/// @param hPool handle to the pool
61+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
6162
///
62-
void umfPoolDestroy(umf_memory_pool_handle_t hPool);
63+
umf_result_t umfPoolDestroy(umf_memory_pool_handle_t hPool);
6364

6465
///
6566
/// @brief Allocates \p size bytes of uninitialized storage from \p hPool

include/umf/memory_pool_ops.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ typedef struct umf_memory_pool_ops_t {
4848
/// @brief Finalizes memory pool
4949
/// @param pool pool to finalize
5050
///
51-
void (*finalize)(void *pool);
51+
umf_result_t (*finalize)(void *pool);
5252

5353
///
5454
/// @brief Allocates \p size bytes of uninitialized storage from \p pool

include/umf/memory_provider.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ umf_result_t umfMemoryProviderCreate(const umf_memory_provider_ops_t *ops,
5151
///
5252
/// @brief Destroys memory provider.
5353
/// @param hProvider handle to the memory provider
54+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
5455
///
55-
void umfMemoryProviderDestroy(umf_memory_provider_handle_t hProvider);
56+
umf_result_t umfMemoryProviderDestroy(umf_memory_provider_handle_t hProvider);
5657

5758
///
5859
/// @brief Allocates \p size bytes of uninitialized storage from memory \p hProvider

include/umf/memory_provider_ops.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ typedef struct umf_memory_provider_ops_t {
4343
/// @brief Finalizes memory provider.
4444
/// @param provider provider to finalize
4545
///
46-
void (*finalize)(void *provider);
46+
umf_result_t (*finalize)(void *provider);
4747

4848
///
4949
/// @brief Allocates \p size bytes of uninitialized storage from memory \p provider

include/umf/memspace.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
*
3-
* Copyright (C) 2023-2024 Intel Corporation
3+
* Copyright (C) 2023-2025 Intel Corporation
44
*
55
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
66
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
@@ -58,8 +58,9 @@ umf_result_t umfMemspaceCreateFromNumaArray(unsigned *nodeIds, size_t numIds,
5858
///
5959
/// \brief Destroys memspace
6060
/// \param hMemspace handle to memspace
61+
/// \return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
6162
///
62-
void umfMemspaceDestroy(umf_memspace_handle_t hMemspace);
63+
umf_result_t umfMemspaceDestroy(umf_memspace_handle_t hMemspace);
6364

6465
///
6566
/// \brief Retrieves predefined host all memspace.

include/umf/pools/pool_disjoint.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ umfDisjointPoolSharedLimitsCreate(size_t MaxSize);
3535

3636
/// @brief Destroy previously created pool limits struct.
3737
/// @param hSharedLimits handle to the shared limits struct.
38-
void umfDisjointPoolSharedLimitsDestroy(
38+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
39+
umf_result_t umfDisjointPoolSharedLimitsDestroy(
3940
umf_disjoint_pool_shared_limits_handle_t hSharedLimits);
4041

4142
/// @brief Create a struct to store parameters of disjoint pool.

src/memory_pool.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,24 +201,31 @@ static umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,
201201
return ret;
202202
}
203203

204-
void umfPoolDestroy(umf_memory_pool_handle_t hPool) {
204+
umf_result_t umfPoolDestroy(umf_memory_pool_handle_t hPool) {
205205
if (umf_ba_global_is_destroyed()) {
206-
return;
206+
return UMF_RESULT_ERROR_UNKNOWN;
207207
}
208208

209-
hPool->ops.finalize(hPool->pool_priv);
209+
umf_result_t ret = UMF_RESULT_SUCCESS;
210+
if (hPool->ops.finalize(hPool->pool_priv) != UMF_RESULT_SUCCESS) {
211+
ret = UMF_RESULT_ERROR_UNKNOWN;
212+
}
210213

211214
umf_memory_provider_handle_t hUpstreamProvider = NULL;
212215
umfPoolGetMemoryProvider(hPool, &hUpstreamProvider);
213216

214217
if (!(hPool->flags & UMF_POOL_CREATE_FLAG_DISABLE_TRACKING)) {
215218
// Destroy tracking provider.
216-
umfMemoryProviderDestroy(hPool->provider);
219+
if (umfMemoryProviderDestroy(hPool->provider) != UMF_RESULT_SUCCESS) {
220+
ret = UMF_RESULT_ERROR_UNKNOWN;
221+
}
217222
}
218223

219224
if (hPool->flags & UMF_POOL_CREATE_FLAG_OWN_PROVIDER) {
220225
// Destroy associated memory provider.
221-
umfMemoryProviderDestroy(hUpstreamProvider);
226+
if (umfMemoryProviderDestroy(hUpstreamProvider) != UMF_RESULT_SUCCESS) {
227+
ret = UMF_RESULT_ERROR_UNKNOWN;
228+
}
222229
}
223230

224231
utils_mutex_destroy_not_free(&hPool->lock);
@@ -227,6 +234,7 @@ void umfPoolDestroy(umf_memory_pool_handle_t hPool) {
227234

228235
// TODO: this free keeps memory in base allocator, so it can lead to OOM in some scenarios (it should be optimized)
229236
umf_ba_global_free(hPool);
237+
return ret;
230238
}
231239

232240
umf_result_t umfFree(void *ptr) {

src/memory_provider.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -235,11 +235,18 @@ umf_result_t umfMemoryProviderCreate(const umf_memory_provider_ops_t *ops,
235235
return UMF_RESULT_SUCCESS;
236236
}
237237

238-
void umfMemoryProviderDestroy(umf_memory_provider_handle_t hProvider) {
239-
if (hProvider && !umf_ba_global_is_destroyed()) {
240-
hProvider->ops.finalize(hProvider->provider_priv);
241-
umf_ba_global_free(hProvider);
238+
umf_result_t umfMemoryProviderDestroy(umf_memory_provider_handle_t hProvider) {
239+
if (umf_ba_global_is_destroyed()) {
240+
return UMF_RESULT_ERROR_UNKNOWN;
242241
}
242+
243+
if (!hProvider) {
244+
return UMF_RESULT_SUCCESS;
245+
}
246+
247+
umf_result_t ret = hProvider->ops.finalize(hProvider->provider_priv);
248+
umf_ba_global_free(hProvider);
249+
return ret;
243250
}
244251

245252
static void

src/memspace.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
*
3-
* Copyright (C) 2023-2024 Intel Corporation
3+
* Copyright (C) 2023-2025 Intel Corporation
44
*
55
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
66
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
@@ -130,14 +130,15 @@ umf_result_t umfMemspaceNew(umf_memspace_handle_t *hMemspace) {
130130
return UMF_RESULT_SUCCESS;
131131
}
132132

133-
void umfMemspaceDestroy(umf_memspace_handle_t memspace) {
133+
umf_result_t umfMemspaceDestroy(umf_memspace_handle_t memspace) {
134134
assert(memspace);
135135
for (size_t i = 0; i < memspace->size; i++) {
136136
umfMemtargetDestroy(memspace->nodes[i]);
137137
}
138138

139139
umf_ba_global_free(memspace->nodes);
140140
umf_ba_global_free(memspace);
141+
return UMF_RESULT_SUCCESS;
141142
}
142143

143144
umf_result_t umfMemspaceClone(umf_const_memspace_handle_t hMemspace,

src/pool/pool_disjoint.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -995,9 +995,9 @@ umf_result_t disjoint_pool_get_last_allocation_error(void *pool) {
995995
}
996996

997997
// Define destructor for use with unique_ptr
998-
void disjoint_pool_finalize(void *pool) {
998+
umf_result_t disjoint_pool_finalize(void *pool) {
999999
disjoint_pool_t *hPool = (disjoint_pool_t *)pool;
1000-
1000+
umf_result_t ret = UMF_RESULT_SUCCESS;
10011001
if (hPool->params.pool_trace > 1) {
10021002
disjoint_pool_print_stats(hPool);
10031003
}
@@ -1008,10 +1008,15 @@ void disjoint_pool_finalize(void *pool) {
10081008

10091009
VALGRIND_DO_DESTROY_MEMPOOL(hPool);
10101010

1011-
umfDisjointPoolSharedLimitsDestroy(hPool->default_shared_limits);
1011+
if (umfDisjointPoolSharedLimitsDestroy(hPool->default_shared_limits) !=
1012+
UMF_RESULT_SUCCESS) {
1013+
ret = UMF_RESULT_ERROR_UNKNOWN;
1014+
LOG_ERR("umfDisjointPoolSharedLimitsDestroy failed");
1015+
}
10121016
critnib_delete(hPool->known_slabs);
10131017

10141018
umf_ba_global_free(hPool);
1019+
return ret;
10151020
}
10161021

10171022
const char *disjoint_pool_get_name(void *pool) {
@@ -1053,9 +1058,10 @@ umfDisjointPoolSharedLimitsCreate(size_t max_size) {
10531058
return ptr;
10541059
}
10551060

1056-
void umfDisjointPoolSharedLimitsDestroy(
1057-
umf_disjoint_pool_shared_limits_t *limits) {
1061+
umf_result_t
1062+
umfDisjointPoolSharedLimitsDestroy(umf_disjoint_pool_shared_limits_t *limits) {
10581063
umf_ba_global_free(limits);
1064+
return UMF_RESULT_SUCCESS;
10591065
}
10601066

10611067
umf_result_t

src/pool/pool_jemalloc.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -521,18 +521,23 @@ static umf_result_t op_initialize(umf_memory_provider_handle_t provider,
521521
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
522522
}
523523

524-
static void op_finalize(void *pool) {
524+
static umf_result_t op_finalize(void *pool) {
525525
assert(pool);
526+
umf_result_t ret = UMF_RESULT_SUCCESS;
526527
jemalloc_memory_pool_t *je_pool = (jemalloc_memory_pool_t *)pool;
527528
for (size_t i = 0; i < je_pool->n_arenas; i++) {
528529
char cmd[64];
529530
unsigned arena = je_pool->arena_index[i];
530531
snprintf(cmd, sizeof(cmd), "arena.%u.destroy", arena);
531-
(void)je_mallctl(cmd, NULL, 0, NULL, 0);
532+
if (je_mallctl(cmd, NULL, 0, NULL, 0)) {
533+
LOG_ERR("Could not destroy jemalloc arena %u", arena);
534+
ret = UMF_RESULT_ERROR_UNKNOWN;
535+
}
532536
}
533537
umf_ba_global_free(je_pool);
534538

535539
VALGRIND_DO_DESTROY_MEMPOOL(pool);
540+
return ret;
536541
}
537542

538543
static size_t op_malloc_usable_size(void *pool, const void *ptr) {

src/pool/pool_proxy.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ proxy_pool_initialize(umf_memory_provider_handle_t hProvider,
3939
return UMF_RESULT_SUCCESS;
4040
}
4141

42-
static void proxy_pool_finalize(void *pool) { umf_ba_global_free(pool); }
42+
static umf_result_t proxy_pool_finalize(void *pool) {
43+
umf_ba_global_free(pool);
44+
return UMF_RESULT_SUCCESS;
45+
}
4346

4447
static void *proxy_aligned_malloc(void *pool, size_t size, size_t alignment) {
4548
assert(pool);

src/pool/pool_scalable.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ static const char *tbb_symbol[TBB_POOL_SYMBOLS_MAX] = {
9999
"?pool_free@rml@@YA_NPEAVMemoryPool@1@PEAX@Z",
100100
("?pool_create_v1@rml@@YA?AW4MemPoolError@1@_JPEBUMemPoolPolicy@1@"
101101
"PEAPEAVMemoryPool@1@@Z"),
102-
"?pool_destroy@rml@@YA_NPEAVMemoryPool@1@@Z",
102+
"?/* pool_destroy */@rml@@YA_NPEAVMemoryPool@1@@Z",
103103
"?pool_identify@rml@@YAPEAVMemoryPool@1@PEAX@Z",
104104
"?pool_msize@rml@@YA_KPEAVMemoryPool@1@PEAX@Z"
105105
#else
@@ -313,10 +313,15 @@ static umf_result_t tbb_pool_initialize(umf_memory_provider_handle_t provider,
313313
return res;
314314
}
315315

316-
static void tbb_pool_finalize(void *pool) {
316+
static umf_result_t tbb_pool_finalize(void *pool) {
317317
tbb_memory_pool_t *pool_data = (tbb_memory_pool_t *)pool;
318-
tbb_callbacks.pool_destroy(pool_data->tbb_pool);
318+
umf_result_t ret = UMF_RESULT_SUCCESS;
319+
if (!tbb_callbacks.pool_destroy(pool_data->tbb_pool)) {
320+
LOG_ERR("TBB pool destroy failed");
321+
ret = UMF_RESULT_ERROR_UNKNOWN;
322+
}
319323
umf_ba_global_free(pool_data);
324+
return ret;
320325
}
321326

322327
static void *tbb_malloc(void *pool, size_t size) {

src/provider/provider_cuda.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,8 +369,9 @@ static umf_result_t cu_memory_provider_initialize(const void *params,
369369
return UMF_RESULT_SUCCESS;
370370
}
371371

372-
static void cu_memory_provider_finalize(void *provider) {
372+
static umf_result_t cu_memory_provider_finalize(void *provider) {
373373
umf_ba_global_free(provider);
374+
return UMF_RESULT_SUCCESS;
374375
}
375376

376377
/*

src/provider/provider_devdax_memory.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,12 +265,19 @@ static umf_result_t devdax_initialize(const void *params, void **provider) {
265265
return ret;
266266
}
267267

268-
static void devdax_finalize(void *provider) {
268+
static umf_result_t devdax_finalize(void *provider) {
269269
devdax_memory_provider_t *devdax_provider = provider;
270+
umf_result_t ret = UMF_RESULT_SUCCESS;
270271
utils_mutex_destroy_not_free(&devdax_provider->lock);
271-
utils_munmap(devdax_provider->base, devdax_provider->size);
272+
if (utils_munmap(devdax_provider->base, devdax_provider->size)) {
273+
LOG_PERR("unmapping the devdax memory failed (path: %s, size: %zu)",
274+
devdax_provider->path, devdax_provider->size);
275+
ret = UMF_RESULT_ERROR_UNKNOWN;
276+
}
277+
272278
coarse_delete(devdax_provider->coarse);
273279
umf_ba_global_free(devdax_provider);
280+
return ret;
274281
}
275282

276283
static umf_result_t devdax_alloc(void *provider, size_t size, size_t alignment,

src/provider/provider_file_memory.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,12 +305,14 @@ static umf_result_t file_initialize(const void *params, void **provider) {
305305
return ret;
306306
}
307307

308-
static void file_finalize(void *provider) {
308+
static umf_result_t file_finalize(void *provider) {
309309
file_memory_provider_t *file_provider = provider;
310310

311311
uintptr_t key = 0;
312312
uintptr_t rkey = 0;
313313
void *rvalue = NULL;
314+
umf_result_t ret = UMF_RESULT_SUCCESS;
315+
;
314316
while (1 == critnib_find(file_provider->mmaps, key, FIND_G, &rkey, &rvalue,
315317
NULL)) {
316318
utils_munmap((void *)rkey, (size_t)rvalue);
@@ -319,11 +321,17 @@ static void file_finalize(void *provider) {
319321
}
320322

321323
utils_mutex_destroy_not_free(&file_provider->lock);
322-
utils_close_fd(file_provider->fd);
324+
325+
if (utils_close_fd(file_provider->fd)) {
326+
LOG_PERR("closing file descriptor %d failed", file_provider->fd);
327+
ret = UMF_RESULT_ERROR_UNKNOWN;
328+
}
323329
critnib_delete(file_provider->fd_offset_map);
324330
critnib_delete(file_provider->mmaps);
325331
coarse_delete(file_provider->coarse);
326332
umf_ba_global_free(file_provider);
333+
334+
return ret;
327335
}
328336

329337
static umf_result_t file_mmap_aligned(file_memory_provider_t *file_provider,

src/provider/provider_fixed_memory.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,11 @@ static umf_result_t fixed_initialize(const void *params, void **provider) {
153153
return ret;
154154
}
155155

156-
static void fixed_finalize(void *provider) {
156+
static umf_result_t fixed_finalize(void *provider) {
157157
fixed_memory_provider_t *fixed_provider = provider;
158158
coarse_delete(fixed_provider->coarse);
159159
umf_ba_global_free(fixed_provider);
160+
return UMF_RESULT_SUCCESS;
160161
}
161162

162163
static umf_result_t fixed_alloc(void *provider, size_t size, size_t alignment,

src/provider/provider_level_zero.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,11 +479,12 @@ static umf_result_t query_min_page_size(ze_memory_provider_t *ze_provider,
479479
return ze2umf_result(ze_result);
480480
}
481481

482-
static void ze_memory_provider_finalize(void *provider) {
482+
static umf_result_t ze_memory_provider_finalize(void *provider) {
483483
ze_memory_provider_t *ze_provider = (ze_memory_provider_t *)provider;
484484
umf_ba_global_free(ze_provider->resident_device_handles);
485485

486486
umf_ba_global_free(provider);
487+
return UMF_RESULT_SUCCESS;
487488
}
488489

489490
static umf_result_t ze_memory_provider_initialize(const void *params,

src/provider/provider_os_memory.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@ static umf_result_t os_initialize(const void *params, void **provider) {
701701
return ret;
702702
}
703703

704-
static void os_finalize(void *provider) {
704+
static umf_result_t os_finalize(void *provider) {
705705
os_memory_provider_t *os_provider = provider;
706706

707707
if (os_provider->fd > 0) {
@@ -721,6 +721,7 @@ static void os_finalize(void *provider) {
721721
}
722722
hwloc_topology_destroy(os_provider->topo);
723723
umf_ba_global_free(os_provider);
724+
return UMF_RESULT_SUCCESS;
724725
}
725726

726727
// TODO: this function should be re-enabled when CTL is implemented

src/provider/provider_tracking.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -988,7 +988,7 @@ static void check_if_tracker_is_empty(umf_memory_tracker_handle_t hTracker,
988988
}
989989
#endif /* NDEBUG */
990990

991-
static void trackingFinalize(void *provider) {
991+
static umf_result_t trackingFinalize(void *provider) {
992992
umf_tracking_memory_provider_t *p =
993993
(umf_tracking_memory_provider_t *)provider;
994994

@@ -997,6 +997,7 @@ static void trackingFinalize(void *provider) {
997997
critnib_delete(p->ipcCache);
998998

999999
umf_ba_global_free(provider);
1000+
return UMF_RESULT_SUCCESS;
10001001
}
10011002

10021003
static void trackingGetLastError(void *provider, const char **msg,

0 commit comments

Comments
 (0)