Fix lock issue when getting vconf value 91/141191/3
authorJihoon Kim <jihoon48.kim@samsung.com>
Fri, 28 Jul 2017 11:30:31 +0000 (20:30 +0900)
committerJi-hoon Lee <dalton.lee@samsung.com>
Sat, 29 Jul 2017 02:52:22 +0000 (02:52 +0000)
Calling vconf_get_XXX function in vconf changed callback leads to lock up.
vconf_keynode_get_XXX function would be correct usage.

Change-Id: Ia6d502aa09236dc35ca94cfa359e7c67401c5f8e
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
ism/extras/efl_panel/isf_panel_efl.cpp
ism/extras/wayland_immodule/wayland_imcontext.c

index daf0534..e414606 100644 (file)
@@ -278,13 +278,13 @@ static void       change_keyboard_mode                 (TOOLBAR_MODE_T mode);
 static unsigned int get_ise_index                      (const String uuid);
 static bool       set_active_ise                       (const String &uuid, bool launch_ise);
 static bool       update_ise_list                      (std::vector<String> &list);
-static void       update_ise_locale                    ();
+static void       update_ise_locale                    (const char *lang = NULL);
 #ifdef HAVE_NOTIFICATION
 static void       delete_notification                  (NotificationData *noti_data);
 static void       create_notification                  (NotificationData *noti_data);
 static void       show_ime_selector_notification       (void);
 #endif
-static void       set_language_and_locale              (void);
+static void       set_language_and_locale              (const char *lang_str);
 static void       app_control_launch                   (const char *app_id);
 
 /////////////////////////////////////////////////////////////////////////////
@@ -6285,16 +6285,29 @@ static void signalhandler (int sig)
 }
 
 #ifdef HAVE_VCONF
-static void update_ise_locale ()
+static void update_ise_locale (const char *language)
 {
-    char *lang_str = vconf_get_str (VCONFKEY_LANGSET);
-    if (lang_str && _locale_string.compare(lang_str) == 0) {
-        free (lang_str);
-        return;
+    String strLang;
+
+    if (language) {
+        strLang = String (language);
     }
+    else {
+        char *lang_str = vconf_get_str (VCONFKEY_LANGSET);
+        if (lang_str && _locale_string.compare(lang_str) == 0) {
+            free (lang_str);
+            return;
+        }
 
-    LOGD ("update all ISE names according to display language\n");
-    set_language_and_locale ();
+        strLang = String (lang_str);
+
+        if (lang_str) {
+            free (lang_str);
+        }
+    }
+
+    LOGD ("update all ISE names according to display language : %s\n", strLang.c_str ());
+    set_language_and_locale (strLang.c_str ());
 
     bool need_to_init_db = false;
 #ifdef HAVE_PKGMGR_INFO
@@ -6338,10 +6351,9 @@ static void update_ise_locale ()
         _initialize_ime_info ();
     }
 
-    if (lang_str) {
-        isf_db_update_disp_lang(lang_str);
-        _locale_string = String (lang_str);
-        free (lang_str);
+    if (strLang.length () > 0) {
+        isf_db_update_disp_lang (strLang.c_str ());
+        _locale_string = strLang;
     }
 }
 
@@ -6350,16 +6362,14 @@ static void update_ise_locale ()
  *
  * @return void
  */
-static void set_language_and_locale (void)
+static void set_language_and_locale (const char *lang_str)
 {
     SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
 
     char language[256];
 
-#ifdef HAVE_VCONF
-    char *lang_str = vconf_get_str (VCONFKEY_LANGSET);
-
     if (lang_str) {
+        LOGD ("language : %s\n", lang_str);
 #if ISF_BUILD_CANDIDATE_UI
         elm_language_set (lang_str);
 #endif /* CANDIDATE */
@@ -6368,12 +6378,10 @@ static void set_language_and_locale (void)
         setenv ("LANGUAGE", language, 1);
         setenv ("LANG", lang_str, 1);
         setlocale (LC_MESSAGES, lang_str);
-        free (lang_str);
     } else {
         setenv ("LANG", "en_US.utf8", 1);
         setlocale (LC_MESSAGES, "en_US.utf8");
     }
-#endif /* HAVE_VCONF */
 }
 
 /**
@@ -6388,7 +6396,9 @@ static void display_language_changed_cb (keynode_t *key, void* data)
 {
     SCIM_DEBUG_MAIN (3) << __FUNCTION__ << "...\n";
 
-    set_language_and_locale ();
+    char *lang_str = vconf_keynode_get_str (key);
+    LOGD ("lang : %s\n", lang_str);
+    set_language_and_locale (lang_str);
 
     /* Update all ISE names according to display language */
     update_ise_locale ();
@@ -6413,8 +6423,9 @@ static void display_language_changed_cb (keynode_t *key, void* data)
  */
 static void keyboard_mode_changed_cb (keynode_t *key, void* data)
 {
-    int val;
-    if (vconf_get_bool (VCONFKEY_ISF_HW_KEYBOARD_INPUT_DETECTED, &val) == 0 && val == 0) {
+    bool val = vconf_keynode_get_bool (key);
+
+    if (val == 0) {
         _info_manager->reset_keyboard_ise ();
         change_keyboard_mode (TOOLBAR_HELPER_MODE);
         _info_manager->update_input_panel_event (ECORE_IMF_INPUT_PANEL_GEOMETRY_EVENT, 0);
@@ -7133,6 +7144,7 @@ int main (int argc, char *argv [])
     String        config_name     = String ("simple");
     String        display_name    = String ();
     char          buf[256]        = {0};
+    char         *lang_str        = NULL;
 
 #ifdef HAVE_ECOREX
     Ecore_Event_Handler *xclient_message_handler  = NULL;
@@ -7369,9 +7381,12 @@ int main (int argc, char *argv [])
     load_config ();
     check_time ("load_config");
 
-    set_language_and_locale ();
-
 #ifdef HAVE_VCONF
+    lang_str = vconf_get_str (VCONFKEY_LANGSET);
+    set_language_and_locale (lang_str);
+    if (lang_str)
+        free (lang_str);
+
     /* Add callback function for input language and display language */
     vconf_notify_key_changed (VCONFKEY_LANGSET, display_language_changed_cb, NULL);
     vconf_notify_key_changed (VCONFKEY_ISF_HW_KEYBOARD_INPUT_DETECTED, keyboard_mode_changed_cb, NULL);
index a9c1f45..ffe2b52 100644 (file)
@@ -277,12 +277,9 @@ _device_info_send (unsigned int window, Eina_Bool flag)
 }
 
 static void
-get_input_language ()
+set_input_language (const char *input_lang_str)
 {
     unsigned int i;
-    char *input_lang_str = vconf_get_str (VCONFKEY_ISF_INPUT_LANGUAGE);
-    if (!input_lang_str) return;
-    LOGD ("language %s", input_lang_str);
     input_lang = INPUT_LANG_OTHER;
 
     for (i = 0; i < (sizeof (__language_infos) / sizeof (__language_infos[0])); i++) {
@@ -291,8 +288,6 @@ get_input_language ()
             break;
         }
     }
-
-    free (input_lang_str);
 }
 
 static void autoperiod_allow_changed_cb (keynode_t *key, void* data)
@@ -307,7 +302,11 @@ static void autocapital_allow_changed_cb (keynode_t *key, void* data)
 
 static void input_language_changed_cb (keynode_t *key, void* data)
 {
-    get_input_language ();
+    char *input_lang = vconf_keynode_get_str (key);
+    if (input_lang) {
+        set_input_language (input_lang);
+        LOGD("input lang : %s\n", input_lang);
+    }
 }
 
 static Eina_Bool
@@ -2521,7 +2520,11 @@ void wayland_im_initialize ()
     register_key_handler ();
 
     /* get input language vconf value */
-    get_input_language ();
+    char *input_lang_str = vconf_get_str (VCONFKEY_ISF_INPUT_LANGUAGE);
+    if (input_lang_str) {
+        set_input_language (input_lang_str);
+        free (input_lang_str);
+    }
 
 #ifdef HAVE_VCONF
     /* get autoperiod allow vconf value */