@@ -27,8 +27,8 @@ static int CTL_SUBTREE_HANDLER(by_handle_provider)(
2727 umf_ctl_query_type_t queryType ) {
2828 (void )indexes , (void )source ;
2929 umf_memory_provider_handle_t hProvider = (umf_memory_provider_handle_t )ctx ;
30- hProvider -> ops .ctl (hProvider -> provider_priv , /*unused*/ 0 , extra_name , arg ,
31- queryType );
30+ hProvider -> ops .ext_ctl (hProvider -> provider_priv , /*unused*/ 0 , extra_name ,
31+ arg , queryType );
3232 return 0 ;
3333}
3434
@@ -120,67 +120,78 @@ static umf_result_t umfDefaultCtlHandle(void *provider, int operationType,
120120}
121121
122122void assignOpsExtDefaults (umf_memory_provider_ops_t * ops ) {
123- if (!ops -> ext . purge_lazy ) {
124- ops -> ext . purge_lazy = umfDefaultPurgeLazy ;
123+ if (!ops -> ext_purge_lazy ) {
124+ ops -> ext_purge_lazy = umfDefaultPurgeLazy ;
125125 }
126- if (!ops -> ext . purge_force ) {
127- ops -> ext . purge_force = umfDefaultPurgeForce ;
126+ if (!ops -> ext_purge_force ) {
127+ ops -> ext_purge_force = umfDefaultPurgeForce ;
128128 }
129- if (!ops -> ext . allocation_split ) {
130- ops -> ext . allocation_split = umfDefaultAllocationSplit ;
129+ if (!ops -> ext_allocation_split ) {
130+ ops -> ext_allocation_split = umfDefaultAllocationSplit ;
131131 }
132- if (!ops -> ext . allocation_merge ) {
133- ops -> ext . allocation_merge = umfDefaultAllocationMerge ;
132+ if (!ops -> ext_allocation_merge ) {
133+ ops -> ext_allocation_merge = umfDefaultAllocationMerge ;
134134 }
135135}
136136
137137void assignOpsIpcDefaults (umf_memory_provider_ops_t * ops ) {
138- if (!ops -> ipc . get_ipc_handle_size ) {
139- ops -> ipc . get_ipc_handle_size = umfDefaultGetIPCHandleSize ;
138+ if (!ops -> ext_get_ipc_handle_size ) {
139+ ops -> ext_get_ipc_handle_size = umfDefaultGetIPCHandleSize ;
140140 }
141- if (!ops -> ipc . get_ipc_handle ) {
142- ops -> ipc . get_ipc_handle = umfDefaultGetIPCHandle ;
141+ if (!ops -> ext_get_ipc_handle ) {
142+ ops -> ext_get_ipc_handle = umfDefaultGetIPCHandle ;
143143 }
144- if (!ops -> ipc . put_ipc_handle ) {
145- ops -> ipc . put_ipc_handle = umfDefaultPutIPCHandle ;
144+ if (!ops -> ext_put_ipc_handle ) {
145+ ops -> ext_put_ipc_handle = umfDefaultPutIPCHandle ;
146146 }
147- if (!ops -> ipc . open_ipc_handle ) {
148- ops -> ipc . open_ipc_handle = umfDefaultOpenIPCHandle ;
147+ if (!ops -> ext_open_ipc_handle ) {
148+ ops -> ext_open_ipc_handle = umfDefaultOpenIPCHandle ;
149149 }
150- if (!ops -> ipc . close_ipc_handle ) {
151- ops -> ipc . close_ipc_handle = umfDefaultCloseIPCHandle ;
150+ if (!ops -> ext_close_ipc_handle ) {
151+ ops -> ext_close_ipc_handle = umfDefaultCloseIPCHandle ;
152152 }
153- if (!ops -> ctl ) {
154- ops -> ctl = umfDefaultCtlHandle ;
153+ if (!ops -> ext_ctl ) {
154+ ops -> ext_ctl = umfDefaultCtlHandle ;
155155 }
156156}
157157
158- static bool validateOpsMandatory (const umf_memory_provider_ops_t * ops ) {
159- // Mandatory ops should be non-NULL
160- return ops -> alloc && ops -> free && ops -> get_recommended_page_size &&
161- ops -> get_min_page_size && ops -> initialize && ops -> finalize &&
162- ops -> get_last_native_error && ops -> get_name ;
163- }
158+ #define CHECK_OP (ops , fn ) \
159+ if (!(ops)->fn) { \
160+ LOG_ERR("Error: missing function pointer: %s\n", #fn); \
161+ return false; \
162+ }
164163
165- static bool validateOpsExt (const umf_memory_provider_ext_ops_t * ext ) {
166- // split and merge functions should be both NULL or both non-NULL
167- return (ext -> allocation_split && ext -> allocation_merge ) ||
168- (!ext -> allocation_split && !ext -> allocation_merge );
169- }
164+ static bool validateOps (const umf_memory_provider_ops_t * ops ) {
165+ // Validate mandatory operations one by one
166+ CHECK_OP (ops , alloc );
167+ CHECK_OP (ops , free );
168+ CHECK_OP (ops , get_recommended_page_size );
169+ CHECK_OP (ops , get_min_page_size );
170+ CHECK_OP (ops , initialize );
171+ CHECK_OP (ops , finalize );
172+ CHECK_OP (ops , get_last_native_error );
173+ CHECK_OP (ops , get_name );
174+
175+ if ((ops -> ext_allocation_split == NULL ) !=
176+ (ops -> ext_allocation_merge == NULL )) {
177+ LOG_ERR ("Error: ext_allocation_split and ext_allocation_merge must be "
178+ "both set or both NULL\n" );
179+ return false;
180+ }
170181
171- static bool validateOpsIpc (const umf_memory_provider_ipc_ops_t * ipc ) {
172- // valid if all ops->ipc.* are non-NULL or all are NULL
173- return (ipc -> get_ipc_handle_size && ipc -> get_ipc_handle &&
174- ipc -> put_ipc_handle && ipc -> open_ipc_handle &&
175- ipc -> close_ipc_handle ) ||
176- (!ipc -> get_ipc_handle_size && !ipc -> get_ipc_handle &&
177- !ipc -> put_ipc_handle && !ipc -> open_ipc_handle &&
178- !ipc -> close_ipc_handle );
179- }
182+ bool ipcAllSet = ops -> ext_get_ipc_handle_size && ops -> ext_get_ipc_handle &&
183+ ops -> ext_put_ipc_handle && ops -> ext_open_ipc_handle &&
184+ ops -> ext_close_ipc_handle ;
185+ bool ipcAllNull = !ops -> ext_get_ipc_handle_size &&
186+ !ops -> ext_get_ipc_handle && !ops -> ext_put_ipc_handle &&
187+ !ops -> ext_open_ipc_handle && !ops -> ext_close_ipc_handle ;
188+ if (!ipcAllSet && !ipcAllNull ) {
189+ LOG_ERR ("Error: IPC function pointers must be either all set or all "
190+ "NULL\n" );
191+ return false;
192+ }
180193
181- static bool validateOps (const umf_memory_provider_ops_t * ops ) {
182- return validateOpsMandatory (ops ) && validateOpsExt (& (ops -> ext )) &&
183- validateOpsIpc (& (ops -> ipc ));
194+ return true;
184195}
185196
186197umf_result_t umfMemoryProviderCreate (const umf_memory_provider_ops_t * ops ,
@@ -300,7 +311,7 @@ umf_result_t umfMemoryProviderPurgeLazy(umf_memory_provider_handle_t hProvider,
300311 UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
301312 UMF_CHECK ((ptr != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
302313 umf_result_t res =
303- hProvider -> ops .ext . purge_lazy (hProvider -> provider_priv , ptr , size );
314+ hProvider -> ops .ext_purge_lazy (hProvider -> provider_priv , ptr , size );
304315 checkErrorAndSetLastProvider (res , hProvider );
305316 return res ;
306317}
@@ -310,7 +321,7 @@ umf_result_t umfMemoryProviderPurgeForce(umf_memory_provider_handle_t hProvider,
310321 UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
311322 UMF_CHECK ((ptr != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
312323 umf_result_t res =
313- hProvider -> ops .ext . purge_force (hProvider -> provider_priv , ptr , size );
324+ hProvider -> ops .ext_purge_force (hProvider -> provider_priv , ptr , size );
314325 checkErrorAndSetLastProvider (res , hProvider );
315326 return res ;
316327}
@@ -329,7 +340,7 @@ umfMemoryProviderAllocationSplit(umf_memory_provider_handle_t hProvider,
329340 UMF_RESULT_ERROR_INVALID_ARGUMENT );
330341 UMF_CHECK ((firstSize < totalSize ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
331342
332- umf_result_t res = hProvider -> ops .ext . allocation_split (
343+ umf_result_t res = hProvider -> ops .ext_allocation_split (
333344 hProvider -> provider_priv , ptr , totalSize , firstSize );
334345 checkErrorAndSetLastProvider (res , hProvider );
335346 return res ;
@@ -347,7 +358,7 @@ umfMemoryProviderAllocationMerge(umf_memory_provider_handle_t hProvider,
347358 UMF_CHECK (((uintptr_t )highPtr - (uintptr_t )lowPtr < totalSize ),
348359 UMF_RESULT_ERROR_INVALID_ARGUMENT );
349360
350- umf_result_t res = hProvider -> ops .ext . allocation_merge (
361+ umf_result_t res = hProvider -> ops .ext_allocation_merge (
351362 hProvider -> provider_priv , lowPtr , highPtr , totalSize );
352363 checkErrorAndSetLastProvider (res , hProvider );
353364 return res ;
@@ -358,7 +369,7 @@ umfMemoryProviderGetIPCHandleSize(umf_memory_provider_handle_t hProvider,
358369 size_t * size ) {
359370 UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
360371 UMF_CHECK ((size != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
361- return hProvider -> ops .ipc . get_ipc_handle_size (hProvider -> provider_priv ,
372+ return hProvider -> ops .ext_get_ipc_handle_size (hProvider -> provider_priv ,
362373 size );
363374}
364375
@@ -369,7 +380,7 @@ umfMemoryProviderGetIPCHandle(umf_memory_provider_handle_t hProvider,
369380 UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
370381 UMF_CHECK ((ptr != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
371382 UMF_CHECK ((providerIpcData != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
372- return hProvider -> ops .ipc . get_ipc_handle (hProvider -> provider_priv , ptr ,
383+ return hProvider -> ops .ext_get_ipc_handle (hProvider -> provider_priv , ptr ,
373384 size , providerIpcData );
374385}
375386
@@ -378,7 +389,7 @@ umfMemoryProviderPutIPCHandle(umf_memory_provider_handle_t hProvider,
378389 void * providerIpcData ) {
379390 UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
380391 UMF_CHECK ((providerIpcData != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
381- return hProvider -> ops .ipc . put_ipc_handle (hProvider -> provider_priv ,
392+ return hProvider -> ops .ext_put_ipc_handle (hProvider -> provider_priv ,
382393 providerIpcData );
383394}
384395
@@ -388,7 +399,7 @@ umfMemoryProviderOpenIPCHandle(umf_memory_provider_handle_t hProvider,
388399 UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
389400 UMF_CHECK ((providerIpcData != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
390401 UMF_CHECK ((ptr != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
391- return hProvider -> ops .ipc . open_ipc_handle (hProvider -> provider_priv ,
402+ return hProvider -> ops .ext_open_ipc_handle (hProvider -> provider_priv ,
392403 providerIpcData , ptr );
393404}
394405
@@ -397,6 +408,6 @@ umfMemoryProviderCloseIPCHandle(umf_memory_provider_handle_t hProvider,
397408 void * ptr , size_t size ) {
398409 UMF_CHECK ((hProvider != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
399410 UMF_CHECK ((ptr != NULL ), UMF_RESULT_ERROR_INVALID_ARGUMENT );
400- return hProvider -> ops .ipc . close_ipc_handle (hProvider -> provider_priv , ptr ,
411+ return hProvider -> ops .ext_close_ipc_handle (hProvider -> provider_priv , ptr ,
401412 size );
402413}
0 commit comments