mmi-fusion-iface, mmi-fusion, ref_fuison module 21/264021/1
authordyamy-lee <dyamy.lee@samsung.com>
Wed, 18 Aug 2021 07:31:56 +0000 (16:31 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Mon, 13 Sep 2021 11:24:00 +0000 (20:24 +0900)
mmi-fusion-iface : for removing dynamic linker, need to save it's pointer,
                 for fusion_deinit, need to save mmi_fuison_module_data
mmi-fusion : add return value of _modality_fusions_lookup() and _fuison_load_module()
            to know how many fusions loaded or found
             add shutdown logic
modules/ref_fusion : correct to miss return value

Change-Id: Ic51827f9d13f1f4746dc0d44d53acf65a8dea55c

src/mmi-fusion-iface.h
src/mmi-fusion.c

index 5893079..7ab8a8d 100644 (file)
@@ -54,7 +54,9 @@ struct _mmi_fusion_module
 
 struct _mmi_fusion_handle
 {
+       void *fusion_info;
        mmi_fusion_module *module_info;
+       mmi_fusion_module_data *module_data;
        mmi_state state;
 };
 
index 97e1518..efdde3a 100644 (file)
 #define FUSION_PATH "/lib/fusion/"
 
 Eina_List *_fusion_list = NULL;
+int _loaded_fusion_cnt = 0;
 
-void
+int
 _fusion_load_module(const char *fusion_name)
 {
        mmi_fusion_handle *fusion = (mmi_fusion_handle *)calloc(1, sizeof(mmi_fusion_handle));
 
-       void *module_info = NULL;
+       void *fusion_info = NULL;
        mmi_fusion_module *mmi_fusion_module_info = NULL;
 
-       module_info = dlopen(fusion_name, RTLD_LAZY);
+       fusion_info = dlopen(fusion_name, RTLD_LAZY);
 
-       if(!module_info)
+       if(!fusion_info)
        {
                LOGE("Failed to dlopen(error :%s, path :%s)!\n", dlerror(), fusion_name);
-               return;
+               return _loaded_fusion_cnt;
        }
 
-       mmi_fusion_module_info = dlsym(module_info, "mmi_fusion_module_info");
+       mmi_fusion_module_info = dlsym(fusion_info, "mmi_fusion_module_info");
 
        if(!mmi_fusion_module_info)
        {
@@ -65,14 +66,19 @@ _fusion_load_module(const char *fusion_name)
                goto err;
        }
 
+       fusion->fusion_info = fusion_info;
+       fusion->module_info = mmi_fusion_module_info;
        _fusion_list = eina_list_append(_fusion_list, fusion);
 
+       return ++_loaded_fusion_cnt;
+
 err:
-       if(module_info)
-               dlclose(module_info);
+       if(fusion_info)
+               dlclose(fusion_info);
+       return _loaded_fusion_cnt;
 }
 
-void
+int
 _modality_fusions_lookup(void)
 {
        DIR *dir;
@@ -83,7 +89,7 @@ _modality_fusions_lookup(void)
        if(!dir)
        {
                LOGE("no dir = %s\n", FUSION_PATH);
-               return;
+               return -1;
        }
 
        while((entry = readdir(dir)) != NULL)
@@ -96,15 +102,47 @@ _modality_fusions_lookup(void)
                        _fusion_load_module(fusion_name);
                }
        }
+
+       return _loaded_fusion_cnt;
 }
 
 void
 modality_fusions_init(void)
 {
-       _modality_fusions_lookup();
+       int fusion_cnt = -1;
+       fusion_cnt = _modality_fusions_lookup();
+
+       if(fusion_cnt < 0)
+       {
+               LOGE("No find any fusion in path = %s\n", FUSION_PATH);
+               return;
+       }
+
+       LOGD("fusion_cnt is loaded fusion cnt\n");
 }
 
 void
 modality_fusions_shutdown(void)
 {
+       if(!_fusion_list)
+               return;
+
+       Eina_List *l = NULL;
+       mmi_fusion_handle *fusion = NULL;
+       EINA_LIST_FOREACH(_fusion_list, l, fusion)
+       {
+               if(fusion->module_info)
+               {
+                       if(fusion->module_data)
+                               fusion->module_info->fusion_deinit(fusion->module_data);
+                       fusion->module_data = NULL;
+                       fusion->module_info = NULL;
+               }
+               if(fusion->fusion_info)
+                       dlclose(fusion->fusion_info);
+       }
+
+       _fusion_list = eina_list_free(_fusion_list);
+       _fusion_list = NULL;
+       _loaded_fusion_cnt = 0;
 }