Skip to content

Commit 47be762

Browse files
committed
improve error handling in Memory Provider API
1 parent c19c1b8 commit 47be762

File tree

3 files changed

+88
-18
lines changed

3 files changed

+88
-18
lines changed

src/memory_provider.c

Lines changed: 76 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ static umf_result_t CTL_SUBTREE_HANDLER(by_handle_provider)(
2626
umf_ctl_index_utlist_t *indexes, const char *extra_name,
2727
umf_ctl_query_type_t queryType) {
2828
(void)indexes, (void)source;
29+
2930
umf_memory_provider_handle_t hProvider = (umf_memory_provider_handle_t)ctx;
3031
hProvider->ops.ext_ctl(hProvider->provider_priv, /*unused*/ 0, extra_name,
3132
arg, size, queryType);
33+
3234
return UMF_RESULT_SUCCESS;
3335
}
3436

@@ -125,36 +127,44 @@ void assignOpsExtDefaults(umf_memory_provider_ops_t *ops) {
125127
if (!ops->ext_purge_lazy) {
126128
ops->ext_purge_lazy = umfDefaultPurgeLazy;
127129
}
130+
128131
if (!ops->ext_purge_force) {
129132
ops->ext_purge_force = umfDefaultPurgeForce;
130133
}
134+
131135
if (!ops->ext_allocation_split) {
132136
ops->ext_allocation_split = umfDefaultAllocationSplit;
133137
}
138+
134139
if (!ops->ext_allocation_merge) {
135140
ops->ext_allocation_merge = umfDefaultAllocationMerge;
136141
}
142+
143+
if (!ops->ext_ctl) {
144+
ops->ext_ctl = umfDefaultCtlHandle;
145+
}
137146
}
138147

139148
void assignOpsIpcDefaults(umf_memory_provider_ops_t *ops) {
140149
if (!ops->ext_get_ipc_handle_size) {
141150
ops->ext_get_ipc_handle_size = umfDefaultGetIPCHandleSize;
142151
}
152+
143153
if (!ops->ext_get_ipc_handle) {
144154
ops->ext_get_ipc_handle = umfDefaultGetIPCHandle;
145155
}
156+
146157
if (!ops->ext_put_ipc_handle) {
147158
ops->ext_put_ipc_handle = umfDefaultPutIPCHandle;
148159
}
160+
149161
if (!ops->ext_open_ipc_handle) {
150162
ops->ext_open_ipc_handle = umfDefaultOpenIPCHandle;
151163
}
164+
152165
if (!ops->ext_close_ipc_handle) {
153166
ops->ext_close_ipc_handle = umfDefaultCloseIPCHandle;
154167
}
155-
if (!ops->ext_ctl) {
156-
ops->ext_ctl = umfDefaultCtlHandle;
157-
}
158168
}
159169

160170
#define CHECK_OP(ops, fn) \
@@ -261,16 +271,20 @@ umf_result_t umfMemoryProviderAlloc(umf_memory_provider_handle_t hProvider,
261271
size_t size, size_t alignment, void **ptr) {
262272
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
263273
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
274+
264275
umf_result_t res =
265276
hProvider->ops.alloc(hProvider->provider_priv, size, alignment, ptr);
277+
266278
checkErrorAndSetLastProvider(res, hProvider);
267279
return res;
268280
}
269281

270282
umf_result_t umfMemoryProviderFree(umf_memory_provider_handle_t hProvider,
271283
void *ptr, size_t size) {
272284
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
285+
273286
umf_result_t res = hProvider->ops.free(hProvider->provider_priv, ptr, size);
287+
274288
checkErrorAndSetLastProvider(res, hProvider);
275289
return res;
276290
}
@@ -281,12 +295,14 @@ umfMemoryProviderGetLastNativeError(umf_memory_provider_handle_t hProvider,
281295
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
282296
UMF_CHECK((ppMessage != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
283297
UMF_CHECK((pError != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
298+
284299
return hProvider->ops.get_last_native_error(hProvider->provider_priv,
285300
ppMessage, pError);
286301
}
287302

288303
void *umfMemoryProviderGetPriv(umf_memory_provider_handle_t hProvider) {
289304
UMF_CHECK((hProvider != NULL), NULL);
305+
290306
return hProvider->provider_priv;
291307
}
292308

@@ -295,8 +311,10 @@ umfMemoryProviderGetRecommendedPageSize(umf_memory_provider_handle_t hProvider,
295311
size_t size, size_t *pageSize) {
296312
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
297313
UMF_CHECK((pageSize != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
314+
298315
umf_result_t res = hProvider->ops.get_recommended_page_size(
299316
hProvider->provider_priv, size, pageSize);
317+
300318
checkErrorAndSetLastProvider(res, hProvider);
301319
return res;
302320
}
@@ -306,8 +324,10 @@ umfMemoryProviderGetMinPageSize(umf_memory_provider_handle_t hProvider,
306324
const void *ptr, size_t *pageSize) {
307325
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
308326
UMF_CHECK((pageSize != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
327+
309328
umf_result_t res = hProvider->ops.get_min_page_size(
310329
hProvider->provider_priv, ptr, pageSize);
330+
311331
checkErrorAndSetLastProvider(res, hProvider);
312332
return res;
313333
}
@@ -316,15 +336,22 @@ umf_result_t umfMemoryProviderGetName(umf_memory_provider_handle_t hProvider,
316336
const char **name) {
317337
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
318338
UMF_CHECK((name != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
319-
return hProvider->ops.get_name(hProvider->provider_priv, name);
339+
340+
umf_result_t res = hProvider->ops.get_name(hProvider->provider_priv, name);
341+
342+
checkErrorAndSetLastProvider(res, hProvider);
343+
return res;
320344
}
321345

322346
umf_result_t umfMemoryProviderPurgeLazy(umf_memory_provider_handle_t hProvider,
323347
void *ptr, size_t size) {
324348
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
325349
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
350+
351+
ASSERT(hProvider->ops.ext_purge_lazy);
326352
umf_result_t res =
327353
hProvider->ops.ext_purge_lazy(hProvider->provider_priv, ptr, size);
354+
328355
checkErrorAndSetLastProvider(res, hProvider);
329356
return res;
330357
}
@@ -333,15 +360,19 @@ umf_result_t umfMemoryProviderPurgeForce(umf_memory_provider_handle_t hProvider,
333360
void *ptr, size_t size) {
334361
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
335362
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
363+
364+
ASSERT(hProvider->ops.ext_purge_force);
336365
umf_result_t res =
337366
hProvider->ops.ext_purge_force(hProvider->provider_priv, ptr, size);
367+
338368
checkErrorAndSetLastProvider(res, hProvider);
339369
return res;
340370
}
341371

342372
umf_result_t
343373
umfGetLastFailedMemoryProvider(umf_memory_provider_handle_t *provider) {
344374
UMF_CHECK((provider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
375+
345376
*provider = *umfGetLastFailedMemoryProviderPtr();
346377
return UMF_RESULT_SUCCESS;
347378
}
@@ -356,8 +387,10 @@ umfMemoryProviderAllocationSplit(umf_memory_provider_handle_t hProvider,
356387
UMF_RESULT_ERROR_INVALID_ARGUMENT);
357388
UMF_CHECK((firstSize < totalSize), UMF_RESULT_ERROR_INVALID_ARGUMENT);
358389

390+
ASSERT(hProvider->ops.ext_allocation_split);
359391
umf_result_t res = hProvider->ops.ext_allocation_split(
360392
hProvider->provider_priv, ptr, totalSize, firstSize);
393+
361394
checkErrorAndSetLastProvider(res, hProvider);
362395
return res;
363396
}
@@ -374,8 +407,10 @@ umfMemoryProviderAllocationMerge(umf_memory_provider_handle_t hProvider,
374407
UMF_CHECK(((uintptr_t)highPtr - (uintptr_t)lowPtr < totalSize),
375408
UMF_RESULT_ERROR_INVALID_ARGUMENT);
376409

410+
ASSERT(hProvider->ops.ext_allocation_merge);
377411
umf_result_t res = hProvider->ops.ext_allocation_merge(
378412
hProvider->provider_priv, lowPtr, highPtr, totalSize);
413+
379414
checkErrorAndSetLastProvider(res, hProvider);
380415
return res;
381416
}
@@ -385,8 +420,13 @@ umfMemoryProviderGetIPCHandleSize(umf_memory_provider_handle_t hProvider,
385420
size_t *size) {
386421
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
387422
UMF_CHECK((size != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
388-
return hProvider->ops.ext_get_ipc_handle_size(hProvider->provider_priv,
389-
size);
423+
424+
ASSERT(hProvider->ops.ext_get_ipc_handle_size);
425+
umf_result_t res =
426+
hProvider->ops.ext_get_ipc_handle_size(hProvider->provider_priv, size);
427+
428+
checkErrorAndSetLastProvider(res, hProvider);
429+
return res;
390430
}
391431

392432
umf_result_t
@@ -395,18 +435,29 @@ umfMemoryProviderGetIPCHandle(umf_memory_provider_handle_t hProvider,
395435
void *providerIpcData) {
396436
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
397437
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
438+
UMF_CHECK((size != 0), UMF_RESULT_ERROR_INVALID_ARGUMENT);
398439
UMF_CHECK((providerIpcData != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
399-
return hProvider->ops.ext_get_ipc_handle(hProvider->provider_priv, ptr,
400-
size, providerIpcData);
440+
441+
ASSERT(hProvider->ops.ext_get_ipc_handle);
442+
umf_result_t res = hProvider->ops.ext_get_ipc_handle(
443+
hProvider->provider_priv, ptr, size, providerIpcData);
444+
445+
checkErrorAndSetLastProvider(res, hProvider);
446+
return res;
401447
}
402448

403449
umf_result_t
404450
umfMemoryProviderPutIPCHandle(umf_memory_provider_handle_t hProvider,
405451
void *providerIpcData) {
406452
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
407453
UMF_CHECK((providerIpcData != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
408-
return hProvider->ops.ext_put_ipc_handle(hProvider->provider_priv,
409-
providerIpcData);
454+
455+
ASSERT(hProvider->ops.ext_put_ipc_handle);
456+
umf_result_t res = hProvider->ops.ext_put_ipc_handle(
457+
hProvider->provider_priv, providerIpcData);
458+
459+
checkErrorAndSetLastProvider(res, hProvider);
460+
return res;
410461
}
411462

412463
umf_result_t
@@ -415,15 +466,26 @@ umfMemoryProviderOpenIPCHandle(umf_memory_provider_handle_t hProvider,
415466
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
416467
UMF_CHECK((providerIpcData != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
417468
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
418-
return hProvider->ops.ext_open_ipc_handle(hProvider->provider_priv,
419-
providerIpcData, ptr);
469+
470+
ASSERT(hProvider->ops.ext_open_ipc_handle);
471+
umf_result_t res = hProvider->ops.ext_open_ipc_handle(
472+
hProvider->provider_priv, providerIpcData, ptr);
473+
474+
checkErrorAndSetLastProvider(res, hProvider);
475+
return res;
420476
}
421477

422478
umf_result_t
423479
umfMemoryProviderCloseIPCHandle(umf_memory_provider_handle_t hProvider,
424480
void *ptr, size_t size) {
425481
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
426482
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
427-
return hProvider->ops.ext_close_ipc_handle(hProvider->provider_priv, ptr,
428-
size);
483+
UMF_CHECK((size != 0), UMF_RESULT_ERROR_INVALID_ARGUMENT);
484+
485+
ASSERT(hProvider->ops.ext_close_ipc_handle);
486+
umf_result_t res = hProvider->ops.ext_close_ipc_handle(
487+
hProvider->provider_priv, ptr, size);
488+
489+
checkErrorAndSetLastProvider(res, hProvider);
490+
return res;
429491
}

src/utils/utils_assert.h

Lines changed: 5 additions & 3 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
@@ -10,11 +10,13 @@
1010
#ifndef UMF_ASSERT_H
1111
#define UMF_ASSERT_H 1
1212

13-
#include "utils_log.h"
1413
#include <stdint.h>
1514
#include <stdio.h>
1615
#include <stdlib.h>
1716

17+
#include "utils_common.h"
18+
#include "utils_log.h"
19+
1820
#ifdef __cplusplus
1921
extern "C" {
2022
#endif
@@ -50,7 +52,7 @@ extern "C" {
5052

5153
#define UMF_CHECK(condition, errorStatus) \
5254
do { \
53-
if (!(condition)) { \
55+
if (UNLIKELY(!(condition))) { \
5456
LOG_FATAL("UMF check failed: " #condition " in %s", __func__); \
5557
return errorStatus; \
5658
} \

src/utils/utils_common.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,17 @@ typedef enum umf_purge_advise_t {
5757

5858
#define __TLS __declspec(thread)
5959

60+
#define LIKELY(x) (x)
61+
#define UNLIKELY(x) (x)
62+
6063
#else /* Linux */
6164

6265
#define __TLS __thread
6366

64-
#endif /* _WIN32 */
67+
#define LIKELY(x) __builtin_expect(!!(x), 1)
68+
#define UNLIKELY(x) __builtin_expect(!!(x), 0)
69+
70+
#endif /* !_WIN32 */
6571

6672
// get the address of the given string in the environment variable (or NULL)
6773
char *utils_env_var_get_str(const char *envvar, const char *str);

0 commit comments

Comments
 (0)