Skip to content

Commit d678be9

Browse files
Merge pull request #1439 from bratpiorka/rrudnick_last_prov
improve error handling in Memory Provider API
2 parents e2bab4a + 8a3705d commit d678be9

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
@@ -27,10 +27,12 @@ static umf_result_t CTL_SUBTREE_HANDLER(CTL_NONAME, by_handle)(
2727
umf_ctl_index_utlist_t *indexes, const char *extra_name,
2828
umf_ctl_query_type_t queryType, va_list args) {
2929
(void)indexes, (void)source, (void)ctx;
30+
3031
umf_memory_provider_handle_t hProvider =
3132
*(umf_memory_provider_handle_t *)indexes->arg;
3233
hProvider->ops.ext_ctl(hProvider->provider_priv, /*unused*/ 0, extra_name,
3334
arg, size, queryType, args);
35+
3436
return UMF_RESULT_SUCCESS;
3537
}
3638

@@ -135,36 +137,44 @@ void assignOpsExtDefaults(umf_memory_provider_ops_t *ops) {
135137
if (!ops->ext_purge_lazy) {
136138
ops->ext_purge_lazy = umfDefaultPurgeLazy;
137139
}
140+
138141
if (!ops->ext_purge_force) {
139142
ops->ext_purge_force = umfDefaultPurgeForce;
140143
}
144+
141145
if (!ops->ext_allocation_split) {
142146
ops->ext_allocation_split = umfDefaultAllocationSplit;
143147
}
148+
144149
if (!ops->ext_allocation_merge) {
145150
ops->ext_allocation_merge = umfDefaultAllocationMerge;
146151
}
152+
153+
if (!ops->ext_ctl) {
154+
ops->ext_ctl = umfDefaultCtlHandle;
155+
}
147156
}
148157

149158
void assignOpsIpcDefaults(umf_memory_provider_ops_t *ops) {
150159
if (!ops->ext_get_ipc_handle_size) {
151160
ops->ext_get_ipc_handle_size = umfDefaultGetIPCHandleSize;
152161
}
162+
153163
if (!ops->ext_get_ipc_handle) {
154164
ops->ext_get_ipc_handle = umfDefaultGetIPCHandle;
155165
}
166+
156167
if (!ops->ext_put_ipc_handle) {
157168
ops->ext_put_ipc_handle = umfDefaultPutIPCHandle;
158169
}
170+
159171
if (!ops->ext_open_ipc_handle) {
160172
ops->ext_open_ipc_handle = umfDefaultOpenIPCHandle;
161173
}
174+
162175
if (!ops->ext_close_ipc_handle) {
163176
ops->ext_close_ipc_handle = umfDefaultCloseIPCHandle;
164177
}
165-
if (!ops->ext_ctl) {
166-
ops->ext_ctl = umfDefaultCtlHandle;
167-
}
168178
}
169179

170180
#define CHECK_OP(ops, fn) \
@@ -271,16 +281,20 @@ umf_result_t umfMemoryProviderAlloc(umf_memory_provider_handle_t hProvider,
271281
size_t size, size_t alignment, void **ptr) {
272282
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
273283
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
284+
274285
umf_result_t res =
275286
hProvider->ops.alloc(hProvider->provider_priv, size, alignment, ptr);
287+
276288
checkErrorAndSetLastProvider(res, hProvider);
277289
return res;
278290
}
279291

280292
umf_result_t umfMemoryProviderFree(umf_memory_provider_handle_t hProvider,
281293
void *ptr, size_t size) {
282294
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
295+
283296
umf_result_t res = hProvider->ops.free(hProvider->provider_priv, ptr, size);
297+
284298
checkErrorAndSetLastProvider(res, hProvider);
285299
return res;
286300
}
@@ -291,12 +305,14 @@ umfMemoryProviderGetLastNativeError(umf_memory_provider_handle_t hProvider,
291305
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
292306
UMF_CHECK((ppMessage != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
293307
UMF_CHECK((pError != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
308+
294309
return hProvider->ops.get_last_native_error(hProvider->provider_priv,
295310
ppMessage, pError);
296311
}
297312

298313
void *umfMemoryProviderGetPriv(umf_memory_provider_handle_t hProvider) {
299314
UMF_CHECK((hProvider != NULL), NULL);
315+
300316
return hProvider->provider_priv;
301317
}
302318

@@ -305,8 +321,10 @@ umfMemoryProviderGetRecommendedPageSize(umf_memory_provider_handle_t hProvider,
305321
size_t size, size_t *pageSize) {
306322
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
307323
UMF_CHECK((pageSize != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
324+
308325
umf_result_t res = hProvider->ops.get_recommended_page_size(
309326
hProvider->provider_priv, size, pageSize);
327+
310328
checkErrorAndSetLastProvider(res, hProvider);
311329
return res;
312330
}
@@ -316,8 +334,10 @@ umfMemoryProviderGetMinPageSize(umf_memory_provider_handle_t hProvider,
316334
const void *ptr, size_t *pageSize) {
317335
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
318336
UMF_CHECK((pageSize != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
337+
319338
umf_result_t res = hProvider->ops.get_min_page_size(
320339
hProvider->provider_priv, ptr, pageSize);
340+
321341
checkErrorAndSetLastProvider(res, hProvider);
322342
return res;
323343
}
@@ -326,15 +346,22 @@ umf_result_t umfMemoryProviderGetName(umf_memory_provider_handle_t hProvider,
326346
const char **name) {
327347
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
328348
UMF_CHECK((name != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
329-
return hProvider->ops.get_name(hProvider->provider_priv, name);
349+
350+
umf_result_t res = hProvider->ops.get_name(hProvider->provider_priv, name);
351+
352+
checkErrorAndSetLastProvider(res, hProvider);
353+
return res;
330354
}
331355

332356
umf_result_t umfMemoryProviderPurgeLazy(umf_memory_provider_handle_t hProvider,
333357
void *ptr, size_t size) {
334358
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
335359
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
360+
361+
ASSERT(hProvider->ops.ext_purge_lazy);
336362
umf_result_t res =
337363
hProvider->ops.ext_purge_lazy(hProvider->provider_priv, ptr, size);
364+
338365
checkErrorAndSetLastProvider(res, hProvider);
339366
return res;
340367
}
@@ -343,15 +370,19 @@ umf_result_t umfMemoryProviderPurgeForce(umf_memory_provider_handle_t hProvider,
343370
void *ptr, size_t size) {
344371
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
345372
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
373+
374+
ASSERT(hProvider->ops.ext_purge_force);
346375
umf_result_t res =
347376
hProvider->ops.ext_purge_force(hProvider->provider_priv, ptr, size);
377+
348378
checkErrorAndSetLastProvider(res, hProvider);
349379
return res;
350380
}
351381

352382
umf_result_t
353383
umfGetLastFailedMemoryProvider(umf_memory_provider_handle_t *provider) {
354384
UMF_CHECK((provider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
385+
355386
*provider = *umfGetLastFailedMemoryProviderPtr();
356387
return UMF_RESULT_SUCCESS;
357388
}
@@ -366,8 +397,10 @@ umfMemoryProviderAllocationSplit(umf_memory_provider_handle_t hProvider,
366397
UMF_RESULT_ERROR_INVALID_ARGUMENT);
367398
UMF_CHECK((firstSize < totalSize), UMF_RESULT_ERROR_INVALID_ARGUMENT);
368399

400+
ASSERT(hProvider->ops.ext_allocation_split);
369401
umf_result_t res = hProvider->ops.ext_allocation_split(
370402
hProvider->provider_priv, ptr, totalSize, firstSize);
403+
371404
checkErrorAndSetLastProvider(res, hProvider);
372405
return res;
373406
}
@@ -384,8 +417,10 @@ umfMemoryProviderAllocationMerge(umf_memory_provider_handle_t hProvider,
384417
UMF_CHECK(((uintptr_t)highPtr - (uintptr_t)lowPtr < totalSize),
385418
UMF_RESULT_ERROR_INVALID_ARGUMENT);
386419

420+
ASSERT(hProvider->ops.ext_allocation_merge);
387421
umf_result_t res = hProvider->ops.ext_allocation_merge(
388422
hProvider->provider_priv, lowPtr, highPtr, totalSize);
423+
389424
checkErrorAndSetLastProvider(res, hProvider);
390425
return res;
391426
}
@@ -395,8 +430,13 @@ umfMemoryProviderGetIPCHandleSize(umf_memory_provider_handle_t hProvider,
395430
size_t *size) {
396431
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
397432
UMF_CHECK((size != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
398-
return hProvider->ops.ext_get_ipc_handle_size(hProvider->provider_priv,
399-
size);
433+
434+
ASSERT(hProvider->ops.ext_get_ipc_handle_size);
435+
umf_result_t res =
436+
hProvider->ops.ext_get_ipc_handle_size(hProvider->provider_priv, size);
437+
438+
checkErrorAndSetLastProvider(res, hProvider);
439+
return res;
400440
}
401441

402442
umf_result_t
@@ -405,18 +445,29 @@ umfMemoryProviderGetIPCHandle(umf_memory_provider_handle_t hProvider,
405445
void *providerIpcData) {
406446
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
407447
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
448+
UMF_CHECK((size != 0), UMF_RESULT_ERROR_INVALID_ARGUMENT);
408449
UMF_CHECK((providerIpcData != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
409-
return hProvider->ops.ext_get_ipc_handle(hProvider->provider_priv, ptr,
410-
size, providerIpcData);
450+
451+
ASSERT(hProvider->ops.ext_get_ipc_handle);
452+
umf_result_t res = hProvider->ops.ext_get_ipc_handle(
453+
hProvider->provider_priv, ptr, size, providerIpcData);
454+
455+
checkErrorAndSetLastProvider(res, hProvider);
456+
return res;
411457
}
412458

413459
umf_result_t
414460
umfMemoryProviderPutIPCHandle(umf_memory_provider_handle_t hProvider,
415461
void *providerIpcData) {
416462
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
417463
UMF_CHECK((providerIpcData != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
418-
return hProvider->ops.ext_put_ipc_handle(hProvider->provider_priv,
419-
providerIpcData);
464+
465+
ASSERT(hProvider->ops.ext_put_ipc_handle);
466+
umf_result_t res = hProvider->ops.ext_put_ipc_handle(
467+
hProvider->provider_priv, providerIpcData);
468+
469+
checkErrorAndSetLastProvider(res, hProvider);
470+
return res;
420471
}
421472

422473
umf_result_t
@@ -425,15 +476,26 @@ umfMemoryProviderOpenIPCHandle(umf_memory_provider_handle_t hProvider,
425476
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
426477
UMF_CHECK((providerIpcData != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
427478
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
428-
return hProvider->ops.ext_open_ipc_handle(hProvider->provider_priv,
429-
providerIpcData, ptr);
479+
480+
ASSERT(hProvider->ops.ext_open_ipc_handle);
481+
umf_result_t res = hProvider->ops.ext_open_ipc_handle(
482+
hProvider->provider_priv, providerIpcData, ptr);
483+
484+
checkErrorAndSetLastProvider(res, hProvider);
485+
return res;
430486
}
431487

432488
umf_result_t
433489
umfMemoryProviderCloseIPCHandle(umf_memory_provider_handle_t hProvider,
434490
void *ptr, size_t size) {
435491
UMF_CHECK((hProvider != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
436492
UMF_CHECK((ptr != NULL), UMF_RESULT_ERROR_INVALID_ARGUMENT);
437-
return hProvider->ops.ext_close_ipc_handle(hProvider->provider_priv, ptr,
438-
size);
493+
UMF_CHECK((size != 0), UMF_RESULT_ERROR_INVALID_ARGUMENT);
494+
495+
ASSERT(hProvider->ops.ext_close_ipc_handle);
496+
umf_result_t res = hProvider->ops.ext_close_ipc_handle(
497+
hProvider->provider_priv, ptr, size);
498+
499+
checkErrorAndSetLastProvider(res, hProvider);
500+
return res;
439501
}

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)