@@ -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
139148void 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
270282umf_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
288303void * 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
322346umf_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
342372umf_result_t
343373umfGetLastFailedMemoryProvider (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
392432umf_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
403449umf_result_t
404450umfMemoryProviderPutIPCHandle (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
412463umf_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
422478umf_result_t
423479umfMemoryProviderCloseIPCHandle (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}
0 commit comments