1111#include <stdbool.h>
1212#include <stdio.h>
1313#include <stdlib.h>
14+ #include <string.h>
1415
1516#include <umf/base.h>
1617#include <umf/memory_provider.h>
@@ -119,6 +120,13 @@ static umf_result_t umfDefaultCloseIPCHandle(void *provider, void *ptr,
119120 return UMF_RESULT_ERROR_NOT_SUPPORTED ;
120121}
121122
123+ static umf_result_t umfDefaultPostInitialize (const void * params ,
124+ void * provider ) {
125+ (void )params ;
126+ (void )provider ;
127+ return UMF_RESULT_SUCCESS ;
128+ }
129+
122130static umf_result_t
123131umfDefaultCtlHandle (void * provider , umf_ctl_query_source_t operationType ,
124132 const char * name , void * arg , size_t size ,
@@ -153,6 +161,10 @@ void assignOpsExtDefaults(umf_memory_provider_ops_t *ops) {
153161 if (!ops -> ext_ctl ) {
154162 ops -> ext_ctl = umfDefaultCtlHandle ;
155163 }
164+
165+ if (!ops -> ext_post_initialize ) {
166+ ops -> ext_post_initialize = umfDefaultPostInitialize ;
167+ }
156168}
157169
158170void assignOpsIpcDefaults (umf_memory_provider_ops_t * ops ) {
@@ -224,10 +236,24 @@ umf_result_t umfMemoryProviderCreate(const umf_memory_provider_ops_t *ops,
224236 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
225237 }
226238
239+ umf_memory_provider_ops_t compatible_ops ;
227240 if (ops -> version != UMF_PROVIDER_OPS_VERSION_CURRENT ) {
228241 LOG_WARN ("Memory Provider ops version \"%d\" is different than the "
229242 "current version \"%d\"" ,
230243 ops -> version , UMF_PROVIDER_OPS_VERSION_CURRENT );
244+ memset (& compatible_ops , 0 , sizeof (compatible_ops ));
245+ if (UMF_MINOR_VERSION (ops -> version ) == 0 ) {
246+ LOG_INFO ("Detected 1.0 version of Memory Pool ops, "
247+ "upgrading to current version" );
248+ memcpy (& compatible_ops , ops ,
249+ offsetof(umf_memory_provider_ops_t , ext_post_initialize ));
250+ } else {
251+ LOG_ERR ("Memory Provider ops unknown version, which \"%d\" is not "
252+ "supported" ,
253+ ops -> version );
254+ return UMF_RESULT_ERROR_NOT_SUPPORTED ;
255+ }
256+ ops = & compatible_ops ;
231257 }
232258
233259 umf_memory_provider_handle_t provider =
@@ -250,6 +276,14 @@ umf_result_t umfMemoryProviderCreate(const umf_memory_provider_ops_t *ops,
250276
251277 provider -> provider_priv = provider_priv ;
252278
279+ ret = provider -> ops .ext_post_initialize (params , provider_priv );
280+ if (ret != UMF_RESULT_SUCCESS ) {
281+ LOG_ERR ("Failed to post-initialize provider" );
282+ provider -> ops .finalize (provider_priv );
283+ umf_ba_global_free (provider );
284+ return ret ;
285+ }
286+
253287 * hProvider = provider ;
254288
255289 return UMF_RESULT_SUCCESS ;
0 commit comments