@@ -27,10 +27,12 @@ static umf_result_t CTL_SUBTREE_HANDLER(CTL_NONAME, by_handle)(
27
27
umf_ctl_index_utlist_t * indexes , const char * extra_name ,
28
28
umf_ctl_query_type_t queryType , va_list args ) {
29
29
(void )indexes , (void )source , (void )ctx ;
30
+
30
31
umf_memory_provider_handle_t hProvider =
31
32
* (umf_memory_provider_handle_t * )indexes -> arg ;
32
33
hProvider -> ops .ext_ctl (hProvider -> provider_priv , /*unused*/ 0 , extra_name ,
33
34
arg , size , queryType , args );
35
+
34
36
return UMF_RESULT_SUCCESS ;
35
37
}
36
38
@@ -135,36 +137,44 @@ void assignOpsExtDefaults(umf_memory_provider_ops_t *ops) {
135
137
if (!ops -> ext_purge_lazy ) {
136
138
ops -> ext_purge_lazy = umfDefaultPurgeLazy ;
137
139
}
140
+
138
141
if (!ops -> ext_purge_force ) {
139
142
ops -> ext_purge_force = umfDefaultPurgeForce ;
140
143
}
144
+
141
145
if (!ops -> ext_allocation_split ) {
142
146
ops -> ext_allocation_split = umfDefaultAllocationSplit ;
143
147
}
148
+
144
149
if (!ops -> ext_allocation_merge ) {
145
150
ops -> ext_allocation_merge = umfDefaultAllocationMerge ;
146
151
}
152
+
153
+ if (!ops -> ext_ctl ) {
154
+ ops -> ext_ctl = umfDefaultCtlHandle ;
155
+ }
147
156
}
148
157
149
158
void assignOpsIpcDefaults (umf_memory_provider_ops_t * ops ) {
150
159
if (!ops -> ext_get_ipc_handle_size ) {
151
160
ops -> ext_get_ipc_handle_size = umfDefaultGetIPCHandleSize ;
152
161
}
162
+
153
163
if (!ops -> ext_get_ipc_handle ) {
154
164
ops -> ext_get_ipc_handle = umfDefaultGetIPCHandle ;
155
165
}
166
+
156
167
if (!ops -> ext_put_ipc_handle ) {
157
168
ops -> ext_put_ipc_handle = umfDefaultPutIPCHandle ;
158
169
}
170
+
159
171
if (!ops -> ext_open_ipc_handle ) {
160
172
ops -> ext_open_ipc_handle = umfDefaultOpenIPCHandle ;
161
173
}
174
+
162
175
if (!ops -> ext_close_ipc_handle ) {
163
176
ops -> ext_close_ipc_handle = umfDefaultCloseIPCHandle ;
164
177
}
165
- if (!ops -> ext_ctl ) {
166
- ops -> ext_ctl = umfDefaultCtlHandle ;
167
- }
168
178
}
169
179
170
180
#define CHECK_OP (ops , fn ) \
@@ -271,16 +281,20 @@ umf_result_t umfMemoryProviderAlloc(umf_memory_provider_handle_t hProvider,
271
281
size_t size , size_t alignment , void * * ptr ) {
272
282
UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
273
283
UMF_CHECK ((ptr != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
284
+
274
285
umf_result_t res =
275
286
hProvider -> ops .alloc (hProvider -> provider_priv , size , alignment , ptr );
287
+
276
288
checkErrorAndSetLastProvider (res , hProvider );
277
289
return res ;
278
290
}
279
291
280
292
umf_result_t umfMemoryProviderFree (umf_memory_provider_handle_t hProvider ,
281
293
void * ptr , size_t size ) {
282
294
UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
295
+
283
296
umf_result_t res = hProvider -> ops .free (hProvider -> provider_priv , ptr , size );
297
+
284
298
checkErrorAndSetLastProvider (res , hProvider );
285
299
return res ;
286
300
}
@@ -291,12 +305,14 @@ umfMemoryProviderGetLastNativeError(umf_memory_provider_handle_t hProvider,
291
305
UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
292
306
UMF_CHECK ((ppMessage != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
293
307
UMF_CHECK ((pError != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
308
+
294
309
return hProvider -> ops .get_last_native_error (hProvider -> provider_priv ,
295
310
ppMessage , pError );
296
311
}
297
312
298
313
void * umfMemoryProviderGetPriv (umf_memory_provider_handle_t hProvider ) {
299
314
UMF_CHECK ((hProvider != NULL ), NULL );
315
+
300
316
return hProvider -> provider_priv ;
301
317
}
302
318
@@ -305,8 +321,10 @@ umfMemoryProviderGetRecommendedPageSize(umf_memory_provider_handle_t hProvider,
305
321
size_t size , size_t * pageSize ) {
306
322
UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
307
323
UMF_CHECK ((pageSize != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
324
+
308
325
umf_result_t res = hProvider -> ops .get_recommended_page_size (
309
326
hProvider -> provider_priv , size , pageSize );
327
+
310
328
checkErrorAndSetLastProvider (res , hProvider );
311
329
return res ;
312
330
}
@@ -316,8 +334,10 @@ umfMemoryProviderGetMinPageSize(umf_memory_provider_handle_t hProvider,
316
334
const void * ptr , size_t * pageSize ) {
317
335
UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
318
336
UMF_CHECK ((pageSize != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
337
+
319
338
umf_result_t res = hProvider -> ops .get_min_page_size (
320
339
hProvider -> provider_priv , ptr , pageSize );
340
+
321
341
checkErrorAndSetLastProvider (res , hProvider );
322
342
return res ;
323
343
}
@@ -326,15 +346,22 @@ umf_result_t umfMemoryProviderGetName(umf_memory_provider_handle_t hProvider,
326
346
const char * * name ) {
327
347
UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
328
348
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 ;
330
354
}
331
355
332
356
umf_result_t umfMemoryProviderPurgeLazy (umf_memory_provider_handle_t hProvider ,
333
357
void * ptr , size_t size ) {
334
358
UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
335
359
UMF_CHECK ((ptr != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
360
+
361
+ ASSERT (hProvider -> ops .ext_purge_lazy );
336
362
umf_result_t res =
337
363
hProvider -> ops .ext_purge_lazy (hProvider -> provider_priv , ptr , size );
364
+
338
365
checkErrorAndSetLastProvider (res , hProvider );
339
366
return res ;
340
367
}
@@ -343,15 +370,19 @@ umf_result_t umfMemoryProviderPurgeForce(umf_memory_provider_handle_t hProvider,
343
370
void * ptr , size_t size ) {
344
371
UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
345
372
UMF_CHECK ((ptr != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
373
+
374
+ ASSERT (hProvider -> ops .ext_purge_force );
346
375
umf_result_t res =
347
376
hProvider -> ops .ext_purge_force (hProvider -> provider_priv , ptr , size );
377
+
348
378
checkErrorAndSetLastProvider (res , hProvider );
349
379
return res ;
350
380
}
351
381
352
382
umf_result_t
353
383
umfGetLastFailedMemoryProvider (umf_memory_provider_handle_t * provider ) {
354
384
UMF_CHECK ((provider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
385
+
355
386
* provider = * umfGetLastFailedMemoryProviderPtr ();
356
387
return UMF_RESULT_SUCCESS ;
357
388
}
@@ -366,8 +397,10 @@ umfMemoryProviderAllocationSplit(umf_memory_provider_handle_t hProvider,
366
397
UMF_RESULT_ERROR_INVALID_ARGUMENT );
367
398
UMF_CHECK ((firstSize < totalSize ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
368
399
400
+ ASSERT (hProvider -> ops .ext_allocation_split );
369
401
umf_result_t res = hProvider -> ops .ext_allocation_split (
370
402
hProvider -> provider_priv , ptr , totalSize , firstSize );
403
+
371
404
checkErrorAndSetLastProvider (res , hProvider );
372
405
return res ;
373
406
}
@@ -384,8 +417,10 @@ umfMemoryProviderAllocationMerge(umf_memory_provider_handle_t hProvider,
384
417
UMF_CHECK (((uintptr_t )highPtr - (uintptr_t )lowPtr < totalSize ),
385
418
UMF_RESULT_ERROR_INVALID_ARGUMENT );
386
419
420
+ ASSERT (hProvider -> ops .ext_allocation_merge );
387
421
umf_result_t res = hProvider -> ops .ext_allocation_merge (
388
422
hProvider -> provider_priv , lowPtr , highPtr , totalSize );
423
+
389
424
checkErrorAndSetLastProvider (res , hProvider );
390
425
return res ;
391
426
}
@@ -395,8 +430,13 @@ umfMemoryProviderGetIPCHandleSize(umf_memory_provider_handle_t hProvider,
395
430
size_t * size ) {
396
431
UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
397
432
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 ;
400
440
}
401
441
402
442
umf_result_t
@@ -405,18 +445,29 @@ umfMemoryProviderGetIPCHandle(umf_memory_provider_handle_t hProvider,
405
445
void * providerIpcData ) {
406
446
UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
407
447
UMF_CHECK ((ptr != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
448
+ UMF_CHECK ((size != 0 ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
408
449
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 ;
411
457
}
412
458
413
459
umf_result_t
414
460
umfMemoryProviderPutIPCHandle (umf_memory_provider_handle_t hProvider ,
415
461
void * providerIpcData ) {
416
462
UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
417
463
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 ;
420
471
}
421
472
422
473
umf_result_t
@@ -425,15 +476,26 @@ umfMemoryProviderOpenIPCHandle(umf_memory_provider_handle_t hProvider,
425
476
UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
426
477
UMF_CHECK ((providerIpcData != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
427
478
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 ;
430
486
}
431
487
432
488
umf_result_t
433
489
umfMemoryProviderCloseIPCHandle (umf_memory_provider_handle_t hProvider ,
434
490
void * ptr , size_t size ) {
435
491
UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
436
492
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 ;
439
501
}
0 commit comments