Skip to content

Commit b2401c5

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

File tree

3 files changed

+99
-22
lines changed

3 files changed

+99
-22
lines changed

src/memory_provider.c

Lines changed: 87 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -125,36 +125,44 @@ void assignOpsExtDefaults(umf_memory_provider_ops_t *ops) {
125125
if (!ops->ext_purge_lazy) {
126126
ops->ext_purge_lazy = umfDefaultPurgeLazy;
127127
}
128+
128129
if (!ops->ext_purge_force) {
129130
ops->ext_purge_force = umfDefaultPurgeForce;
130131
}
132+
131133
if (!ops->ext_allocation_split) {
132134
ops->ext_allocation_split = umfDefaultAllocationSplit;
133135
}
136+
134137
if (!ops->ext_allocation_merge) {
135138
ops->ext_allocation_merge = umfDefaultAllocationMerge;
136139
}
140+
141+
if (!ops->ext_ctl) {
142+
ops->ext_ctl = umfDefaultCtlHandle;
143+
}
137144
}
138145

139146
void assignOpsIpcDefaults(umf_memory_provider_ops_t *ops) {
140147
if (!ops->ext_get_ipc_handle_size) {
141148
ops->ext_get_ipc_handle_size = umfDefaultGetIPCHandleSize;
142149
}
150+
143151
if (!ops->ext_get_ipc_handle) {
144152
ops->ext_get_ipc_handle = umfDefaultGetIPCHandle;
145153
}
154+
146155
if (!ops->ext_put_ipc_handle) {
147156
ops->ext_put_ipc_handle = umfDefaultPutIPCHandle;
148157
}
158+
149159
if (!ops->ext_open_ipc_handle) {
150160
ops->ext_open_ipc_handle = umfDefaultOpenIPCHandle;
151161
}
162+
152163
if (!ops->ext_close_ipc_handle) {
153164
ops->ext_close_ipc_handle = umfDefaultCloseIPCHandle;
154165
}
155-
if (!ops->ext_ctl) {
156-
ops->ext_ctl = umfDefaultCtlHandle;
157-
}
158166
}
159167

160168
#define CHECK_OP(ops, fn) \
@@ -316,7 +324,9 @@ umf_result_t umfMemoryProviderGetName(umf_memory_provider_handle_t hProvider,
316324
const char **name) {
317325
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
318326
UMF_CHECK((name != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
319-
return hProvider->ops.get_name(hProvider->provider_priv, name);
327+
umf_result_t res = hProvider->ops.get_name(hProvider->provider_priv, name);
328+
checkErrorAndSetLastProvider(res, hProvider);
329+
return res;
320330
}
321331

322332
umf_result_t umfMemoryProviderPurgeLazy(umf_memory_provider_handle_t hProvider,
@@ -356,8 +366,14 @@ umfMemoryProviderAllocationSplit(umf_memory_provider_handle_t hProvider,
356366
UMF_RESULT_ERROR_INVALID_ARGUMENT);
357367
UMF_CHECK((firstSize < totalSize), UMF_RESULT_ERROR_INVALID_ARGUMENT);
358368

359-
umf_result_t res = hProvider->ops.ext_allocation_split(
360-
hProvider->provider_priv, ptr, totalSize, firstSize);
369+
umf_result_t res = UMF_RESULT_SUCCESS;
370+
if (!hProvider->ops.ext_allocation_split) {
371+
res = UMF_RESULT_ERROR_NOT_SUPPORTED;
372+
} else {
373+
res = hProvider->ops.ext_allocation_split(hProvider->provider_priv, ptr,
374+
totalSize, firstSize);
375+
}
376+
361377
checkErrorAndSetLastProvider(res, hProvider);
362378
return res;
363379
}
@@ -374,8 +390,14 @@ umfMemoryProviderAllocationMerge(umf_memory_provider_handle_t hProvider,
374390
UMF_CHECK(((uintptr_t)highPtr - (uintptr_t)lowPtr < totalSize),
375391
UMF_RESULT_ERROR_INVALID_ARGUMENT);
376392

377-
umf_result_t res = hProvider->ops.ext_allocation_merge(
378-
hProvider->provider_priv, lowPtr, highPtr, totalSize);
393+
umf_result_t res = UMF_RESULT_SUCCESS;
394+
if (!hProvider->ops.ext_allocation_merge) {
395+
res = UMF_RESULT_ERROR_NOT_SUPPORTED;
396+
} else {
397+
res = hProvider->ops.ext_allocation_merge(hProvider->provider_priv,
398+
lowPtr, highPtr, totalSize);
399+
}
400+
379401
checkErrorAndSetLastProvider(res, hProvider);
380402
return res;
381403
}
@@ -385,8 +407,17 @@ umfMemoryProviderGetIPCHandleSize(umf_memory_provider_handle_t hProvider,
385407
size_t *size) {
386408
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
387409
UMF_CHECK((size != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
388-
return hProvider->ops.ext_get_ipc_handle_size(hProvider->provider_priv,
389-
size);
410+
411+
umf_result_t res = UMF_RESULT_SUCCESS;
412+
if (!hProvider->ops.ext_get_ipc_handle_size) {
413+
res = UMF_RESULT_ERROR_NOT_SUPPORTED;
414+
} else {
415+
res = hProvider->ops.ext_get_ipc_handle_size(hProvider->provider_priv,
416+
size);
417+
}
418+
419+
checkErrorAndSetLastProvider(res, hProvider);
420+
return res;
390421
}
391422

392423
umf_result_t
@@ -395,18 +426,37 @@ umfMemoryProviderGetIPCHandle(umf_memory_provider_handle_t hProvider,
395426
void *providerIpcData) {
396427
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
397428
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
429+
UMF_CHECK((size != 0), UMF_RESULT_ERROR_INVALID_ARGUMENT);
398430
UMF_CHECK((providerIpcData != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
399-
return hProvider->ops.ext_get_ipc_handle(hProvider->provider_priv, ptr,
400-
size, providerIpcData);
431+
432+
umf_result_t res = UMF_RESULT_SUCCESS;
433+
if (!hProvider->ops.ext_get_ipc_handle) {
434+
res = UMF_RESULT_ERROR_NOT_SUPPORTED;
435+
} else {
436+
res = hProvider->ops.ext_get_ipc_handle(hProvider->provider_priv, ptr,
437+
size, providerIpcData);
438+
}
439+
440+
checkErrorAndSetLastProvider(res, hProvider);
441+
return res;
401442
}
402443

403444
umf_result_t
404445
umfMemoryProviderPutIPCHandle(umf_memory_provider_handle_t hProvider,
405446
void *providerIpcData) {
406447
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
407448
UMF_CHECK((providerIpcData != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
408-
return hProvider->ops.ext_put_ipc_handle(hProvider->provider_priv,
409-
providerIpcData);
449+
450+
umf_result_t res = UMF_RESULT_SUCCESS;
451+
if (!hProvider->ops.ext_put_ipc_handle) {
452+
res = UMF_RESULT_ERROR_NOT_SUPPORTED;
453+
} else {
454+
res = hProvider->ops.ext_put_ipc_handle(hProvider->provider_priv,
455+
providerIpcData);
456+
}
457+
458+
checkErrorAndSetLastProvider(res, hProvider);
459+
return res;
410460
}
411461

412462
umf_result_t
@@ -415,15 +465,34 @@ umfMemoryProviderOpenIPCHandle(umf_memory_provider_handle_t hProvider,
415465
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
416466
UMF_CHECK((providerIpcData != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
417467
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
418-
return hProvider->ops.ext_open_ipc_handle(hProvider->provider_priv,
419-
providerIpcData, ptr);
468+
469+
umf_result_t res = UMF_RESULT_SUCCESS;
470+
if (!hProvider->ops.ext_open_ipc_handle) {
471+
res = UMF_RESULT_ERROR_NOT_SUPPORTED;
472+
} else {
473+
res = hProvider->ops.ext_open_ipc_handle(hProvider->provider_priv,
474+
providerIpcData, ptr);
475+
}
476+
477+
checkErrorAndSetLastProvider(res, hProvider);
478+
return res;
420479
}
421480

422481
umf_result_t
423482
umfMemoryProviderCloseIPCHandle(umf_memory_provider_handle_t hProvider,
424483
void *ptr, size_t size) {
425484
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
426485
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
427-
return hProvider->ops.ext_close_ipc_handle(hProvider->provider_priv, ptr,
428-
size);
486+
UMF_CHECK((size != 0), UMF_RESULT_ERROR_INVALID_ARGUMENT);
487+
488+
umf_result_t res = UMF_RESULT_SUCCESS;
489+
if (!hProvider->ops.ext_close_ipc_handle) {
490+
res = UMF_RESULT_ERROR_NOT_SUPPORTED;
491+
} else {
492+
res = hProvider->ops.ext_close_ipc_handle(hProvider->provider_priv, ptr,
493+
size);
494+
}
495+
496+
checkErrorAndSetLastProvider(res, hProvider);
497+
return res;
429498
}

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)