Load voice-control-elm library in the thread
[platform/core/appfw/app-core.git] / src / efl_base / appcore_efl_base.c
index b8880ea..5280f96 100644 (file)
@@ -20,6 +20,7 @@
 #include <stdlib.h>
 #include <stdbool.h>
 #include <dlfcn.h>
+#include <glib.h>
 #include <Elementary.h>
 #include <vconf.h>
 
@@ -33,6 +34,7 @@ static void *__vc_elm_handle;
 static int (*__vc_elm_initialize)(void);
 static int (*__vc_elm_deinitialize)(void);
 static int (*__vc_elm_set_auto_register_mode)(int, int);
+static GThread *__vc_elm_thread;
 
 static void __unload_vc_elm(void)
 {
@@ -49,15 +51,19 @@ static void __unload_vc_elm(void)
 
 static int __load_vc_elm(void)
 {
-       if (__vc_elm_handle)
+       _DBG("Load voice-control-elm");
+
+       if (__vc_elm_handle) {
+               _DBG("Already exists");
                return 0;
+       }
 
        if (access(PATH_LIB_VC_ELM, F_OK) != 0) {
                _ERR("Failed to access %s", PATH_LIB_VC_ELM);
                return -1;
        }
 
-       __vc_elm_handle = dlopen(PATH_LIB_VC_ELM, RTLD_LAZY | RTLD_GLOBAL);
+       __vc_elm_handle = dlopen(PATH_LIB_VC_ELM, RTLD_LAZY | RTLD_LOCAL);
        if (!__vc_elm_handle) {
                _ERR("Failed to open %s", PATH_LIB_VC_ELM);
                return -1;
@@ -113,11 +119,6 @@ static void __vc_vtauto_changed_cb(keynode_t *key, void *data)
 static void __vc_elm_init(void)
 {
        int vt_automode = 0;
-       int r;
-
-       r = __load_vc_elm();
-       if (r < 0)
-               return;
 
        vconf_notify_key_changed(VCONFKEY_VC_VOICE_TOUCH_AUTOMODE,
                        __vc_vtauto_changed_cb, NULL);
@@ -141,6 +142,33 @@ static void __vc_elm_finish(void)
        }
 }
 
+static gboolean __init_vc_elm(gpointer data)
+{
+       _DBG("Initialize vc-elm");
+       /* Postpone initialization to improve app launching performance */
+       /* VC voice touch setting */
+       __vc_elm_init();
+
+       return G_SOURCE_REMOVE;
+}
+
+static gpointer __vc_elm_loader(gpointer data)
+{
+       int r = 0;
+       int retry_count = 3;
+
+       do {
+               r = __load_vc_elm();
+               if (r == 0) {
+                       g_idle_add(__init_vc_elm, NULL);
+                       break;
+               }
+       } while (retry_count--);
+       LOGW("[vc-elm-loader] Result: %d", r);
+
+       return GINT_TO_POINTER(r);
+}
+
 static void __efl_app_init(int argc, char **argv, void *data)
 {
        int hint;
@@ -164,15 +192,19 @@ static void __efl_app_init(int argc, char **argv, void *data)
                }
        }
 
-       /* VC voice touch setting */
-       if (!getenv("VC_ELM_INIT"))
-               __vc_elm_init();
+       __vc_elm_thread = g_thread_new("vc-elm-loader", __vc_elm_loader, NULL);
 }
 
 static void __efl_app_finish(void)
 {
+       gpointer r;
+
        __vc_elm_finish();
-       unsetenv("VC_ELM_INIT");
+       if (__vc_elm_thread) {
+               r = g_thread_join(__vc_elm_thread);
+               __vc_elm_thread = NULL;
+               _DBG("vc-elm-loader. result(%d)", GPOINTER_TO_INT(r));
+       }
 
        elm_shutdown();
 
@@ -282,6 +314,16 @@ EXPORT_API void appcore_efl_base_window_on_visibility(int type, void *event)
        appcore_ui_base_window_on_visibility(type, event);
 }
 
+EXPORT_API void appcore_efl_base_window_on_pre_visibility(int type, void *event)
+{
+       appcore_ui_base_window_on_pre_visibility(type, event);
+}
+
+EXPORT_API void appcore_efl_base_window_on_aux_message(int type, void *event)
+{
+       appcore_ui_base_window_on_aux_message(type, event);
+}
+
 EXPORT_API void appcore_efl_base_pause(void)
 {
        appcore_ui_base_pause();