@@ -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
139146void 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
322332umf_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
392423umf_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
403444umf_result_t
404445umfMemoryProviderPutIPCHandle (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
412462umf_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
422481umf_result_t
423482umfMemoryProviderCloseIPCHandle (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}
0 commit comments