@@ -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
149158void 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
280292umf_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
298313void * 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
332356umf_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
352382umf_result_t
353383umfGetLastFailedMemoryProvider (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
402442umf_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
413459umf_result_t
414460umfMemoryProviderPutIPCHandle (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
422473umf_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
432488umf_result_t
433489umfMemoryProviderCloseIPCHandle (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}
0 commit comments