Skip to content

Commit cffbeb2

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

35 files changed

+223
-92
lines changed

examples/custom_file_provider/custom_file_provider.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,12 @@ static umf_result_t file_init(const void *params, void **provider) {
104104
}
105105

106106
// Function to deinitialize the file provider
107-
static void file_deinit(void *provider) {
107+
static umf_result_t file_deinit(void *provider) {
108108
file_provider_t *file_provider = (file_provider_t *)provider;
109109
munmap(file_provider->ptr, ADDRESS_RESERVATION);
110110
close(file_provider->fd);
111111
free(file_provider);
112+
return UMF_RESULT_SUCCESS;
112113
}
113114

114115
// Function to allocate memory from the file provider

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: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ typedef struct umf_memory_pool_ops_t {
4747
///
4848
/// @brief Finalizes memory pool
4949
/// @param pool pool to finalize
50+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
5051
///
51-
void (*finalize)(void *pool);
52+
umf_result_t (*finalize)(void *pool);
5253

5354
///
5455
/// @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: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ typedef struct umf_memory_provider_ops_t {
4242
///
4343
/// @brief Finalizes memory provider.
4444
/// @param provider provider to finalize
45+
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
4546
///
46-
void (*finalize)(void *provider);
47+
umf_result_t (*finalize)(void *provider);
4748

4849
///
4950
/// @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: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,24 +201,30 @@ 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 = hPool->ops.finalize(hPool->pool_priv);
210210

211211
umf_memory_provider_handle_t hUpstreamProvider = NULL;
212212
umfPoolGetMemoryProvider(hPool, &hUpstreamProvider);
213213

214214
if (!(hPool->flags & UMF_POOL_CREATE_FLAG_DISABLE_TRACKING)) {
215215
// Destroy tracking provider.
216-
umfMemoryProviderDestroy(hPool->provider);
216+
umf_result_t ret2 = umfMemoryProviderDestroy(hPool->provider);
217+
if (ret == UMF_RESULT_SUCCESS) {
218+
ret = ret2;
219+
}
217220
}
218221

219222
if (hPool->flags & UMF_POOL_CREATE_FLAG_OWN_PROVIDER) {
220223
// Destroy associated memory provider.
221-
umfMemoryProviderDestroy(hUpstreamProvider);
224+
umf_result_t ret2 = umfMemoryProviderDestroy(hUpstreamProvider);
225+
if (ret == UMF_RESULT_SUCCESS) {
226+
ret = ret2;
227+
}
222228
}
223229

224230
utils_mutex_destroy_not_free(&hPool->lock);
@@ -227,6 +233,7 @@ void umfPoolDestroy(umf_memory_pool_handle_t hPool) {
227233

228234
// TODO: this free keeps memory in base allocator, so it can lead to OOM in some scenarios (it should be optimized)
229235
umf_ba_global_free(hPool);
236+
return ret;
230237
}
231238

232239
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
}
@@ -1007,11 +1007,16 @@ void disjoint_pool_finalize(void *pool) {
10071007
}
10081008

10091009
VALGRIND_DO_DESTROY_MEMPOOL(hPool);
1010+
ret = umfDisjointPoolSharedLimitsDestroy(hPool->default_shared_limits);
1011+
if (ret != UMF_RESULT_SUCCESS) {
1012+
ret = UMF_RESULT_ERROR_UNKNOWN;
1013+
LOG_ERR("umfDisjointPoolSharedLimitsDestroy failed");
1014+
}
10101015

1011-
umfDisjointPoolSharedLimitsDestroy(hPool->default_shared_limits);
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: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,12 +305,13 @@ 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;
314315
while (1 == critnib_find(file_provider->mmaps, key, FIND_G, &rkey, &rvalue,
315316
NULL)) {
316317
utils_munmap((void *)rkey, (size_t)rvalue);
@@ -319,11 +320,17 @@ static void file_finalize(void *provider) {
319320
}
320321

321322
utils_mutex_destroy_not_free(&file_provider->lock);
322-
utils_close_fd(file_provider->fd);
323+
324+
if (utils_close_fd(file_provider->fd)) {
325+
LOG_PERR("closing file descriptor %d failed", file_provider->fd);
326+
ret = UMF_RESULT_ERROR_UNKNOWN;
327+
}
323328
critnib_delete(file_provider->fd_offset_map);
324329
critnib_delete(file_provider->mmaps);
325330
coarse_delete(file_provider->coarse);
326331
umf_ba_global_free(file_provider);
332+
333+
return ret;
327334
}
328335

329336
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

0 commit comments

Comments
 (0)