Add keymap mutex in e_comp_wl 89/295189/2
authorJihoon Kim <jihoon48.kim@samsung.com>
Mon, 5 Jun 2023 05:29:46 +0000 (14:29 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Tue, 4 Jul 2023 07:32:19 +0000 (07:32 +0000)
Change-Id: If60d054b7a7d3717a5ae6ffd1636ba6162bdb556
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
src/bin/e_comp_wl.h
src/bin/e_comp_wl_input.c
src/bin/e_devicemgr_inputgen.c
src/bin/e_input_device.c
src/bin/e_input_evdev.c
src/bin/e_input_private.h
src/bin/e_keyrouter.c

index 5275334..ae53bc9 100644 (file)
@@ -340,6 +340,7 @@ struct _E_Comp_Wl_Data
         int fd;
         size_t size;
         char *area;
+        GMutex keymap_mutex;
      } xkb;
 
    struct
index 22d4846..49026e6 100644 (file)
@@ -1285,9 +1285,12 @@ _e_comp_wl_input_keymap_update(struct xkb_keymap *keymap, const char *keymap_pat
    Eina_List *l;
 
    /* unreference any existing keymap */
+   g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
    if (e_comp_wl->xkb.keymap)
      xkb_map_unref(e_comp_wl->xkb.keymap);
 
+   g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
+
    /* unmap any existing keyboard area */
    if (e_comp_wl->xkb.area)
      munmap(e_comp_wl->xkb.area, e_comp_wl->xkb.size);
@@ -1318,7 +1321,9 @@ _e_comp_wl_input_keymap_update(struct xkb_keymap *keymap, const char *keymap_pat
                            latched, locked, 0, 0, group);
 
    /* increment keymap reference */
+   g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
    e_comp_wl->xkb.keymap = keymap;
+   g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
 
    /* fetch updated modifiers */
    e_comp_wl->kbd.mod_shift =
@@ -1392,6 +1397,8 @@ e_comp_wl_input_init(void)
    g_mutex_init(&e_comp_wl->kbd.resource_mutex);
    g_mutex_init(&e_comp_wl->kbd.focused_mutex);
 
+   g_mutex_init(&e_comp_wl->xkb.keymap_mutex);
+
    /* get default keyboard repeat rate/delay from configuration */
    e_comp_wl->kbd.repeat_delay = e_config->keyboard.repeat_delay;
    e_comp_wl->kbd.repeat_rate = e_config->keyboard.repeat_rate;
@@ -1527,8 +1534,10 @@ e_comp_wl_input_shutdown(void)
      xkb_state_unref(e_comp_wl->xkb.state);
 
    /* unreference any existing keymap */
+   g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
    if (e_comp_wl->xkb.keymap)
      xkb_map_unref(e_comp_wl->xkb.keymap);
+   g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
 
    /* unreference any existing context */
    if (e_comp_wl->xkb.context)
@@ -1551,6 +1560,8 @@ e_comp_wl_input_shutdown(void)
 
    dont_set_e_input_keymap = EINA_FALSE;
    dont_use_xkb_cache = EINA_FALSE;
+
+   g_mutex_clear(&e_comp_wl->xkb.keymap_mutex);
 }
 
 EINTERN Eina_Bool
@@ -2021,7 +2032,9 @@ e_comp_wl_input_keymap_keyname_to_keycode(const char * name)
    EINA_SAFETY_ON_NULL_RETURN_VAL(name, 0);
    EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl, 0);
 
+   g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
    keymap = e_comp_wl->xkb.keymap;
+   g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
    EINA_SAFETY_ON_NULL_GOTO(keymap, finish);
 
    keysym = xkb_keysym_from_name(name, XKB_KEYSYM_NO_FLAGS);
index 30d3479..1eefdea 100644 (file)
@@ -1070,11 +1070,15 @@ e_devicemgr_inputgen_generate_key(struct wl_client *client, struct wl_resource *
         DMWRN("generate is not init\n");
         return TIZEN_INPUT_DEVICE_MANAGER_ERROR_INVALID_PARAMETER;
      }
+
+   g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
    if (!e_comp_wl->xkb.keymap)
      {
         DMWRN("keymap is not ready\n");
+        g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
         return TIZEN_INPUT_DEVICE_MANAGER_ERROR_INVALID_PARAMETER;
      }
+   g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
 
    EINA_LIST_FOREACH(e_devicemgr->inputgen.kbd_list, l, ddata)
      {
index 5c22415..9ac9d65 100644 (file)
@@ -112,8 +112,10 @@ _e_input_device_cached_keymap_update(struct xkb_keymap *map)
      EINA_LIST_FOREACH(dev->seats, l2, seat)
        EINA_LIST_FOREACH(e_input_seat_evdev_list_get(seat), l3, edev)
          {
+            g_mutex_unlock(&edev->xkb.keymap_mutex);
             xkb_keymap_unref(edev->xkb.keymap);
             edev->xkb.keymap = xkb_keymap_ref(map);
+            g_mutex_unlock(&edev->xkb.keymap_mutex);
             xkb_state_unref(edev->xkb.state);
             edev->xkb.state = xkb_state_new(map);
          }
index ad5e1fe..d6de7cf 100644 (file)
@@ -211,14 +211,20 @@ _device_keyboard_setup(E_Input_Evdev *edev)
    if (!(input = edev->seat->input)) return;
    if (!input->dev->xkb_ctx) return;
 
+   g_mutex_init(&edev->xkb.keymap_mutex);
+
    /* create keymap from xkb context */
+   g_mutex_lock(&edev->xkb.keymap_mutex);
    edev->xkb.keymap = _e_input_device_cached_keymap_get(input->dev->xkb_ctx, NULL, 0);
    if (!edev->xkb.keymap)
      {
+        g_mutex_unlock(&edev->xkb.keymap_mutex);
         ERR("Failed to create keymap: %m");
         return;
      }
 
+   g_mutex_unlock(&edev->xkb.keymap_mutex);
+
    /* create xkb state */
    if (!(edev->xkb.state = xkb_state_new(edev->xkb.keymap)))
      {
@@ -226,6 +232,7 @@ _device_keyboard_setup(E_Input_Evdev *edev)
         return;
      }
 
+   g_mutex_lock(&edev->xkb.keymap_mutex);
    xkb_idx = xkb_map_mod_get_index(edev->xkb.keymap, XKB_MOD_NAME_CTRL);
    if (xkb_idx != XKB_MOD_INVALID)
      edev->xkb.ctrl_mask = 1 << xkb_idx;
@@ -273,6 +280,8 @@ _device_keyboard_setup(E_Input_Evdev *edev)
      edev->xkb.altgr_mask = 1 << xkb_idx;
    else
      edev->xkb.altgr_mask = 0;
+
+   g_mutex_unlock(&edev->xkb.keymap_mutex);
 }
 
 static int
@@ -665,6 +674,7 @@ _device_handle_key(struct libinput_device *device, struct libinput_event_keyboar
      }
 
    /* if shift is active, we need to transform the key to lower */
+   g_mutex_lock(&edev->xkb.keymap_mutex);
    if (xkb_state_mod_index_is_active(edev->xkb.state,
                                      xkb_map_mod_get_index(edev->xkb.keymap,
                                      XKB_MOD_NAME_SHIFT),
@@ -673,6 +683,7 @@ _device_handle_key(struct libinput_device *device, struct libinput_event_keyboar
         if (keyname[0] != '\0')
           keyname[0] = tolower(keyname[0]);
      }
+   g_mutex_unlock(&edev->xkb.keymap_mutex);
 
    if (_device_keysym_translate(sym, edev->xkb.modifiers,
                                 compose_buffer, sizeof(compose_buffer)))
@@ -2192,7 +2203,9 @@ _e_input_evdev_device_destroy(E_Input_Evdev *edev)
    if (edev->caps & E_INPUT_SEAT_KEYBOARD)
      {
         if (edev->xkb.state) xkb_state_unref(edev->xkb.state);
+        g_mutex_lock(&edev->xkb.keymap_mutex);
         if (edev->xkb.keymap) xkb_map_unref(edev->xkb.keymap);
+        g_mutex_unlock(&edev->xkb.keymap_mutex);
      }
 
    if (edev->ecore_dev) ecore_device_del(edev->ecore_dev);
index 31a5e1c..5a86a30 100644 (file)
@@ -114,6 +114,7 @@ struct _E_Input_Evdev
         unsigned int depressed, latched, locked, group;
 
         Eina_List *pressed_keys;
+        GMutex keymap_mutex;
      } xkb;
 
      Eina_Hash *key_remap_hash;
index a6f6a9d..d8db879 100644 (file)
@@ -437,7 +437,9 @@ _e_keyrouter_query_tizen_key_table(void)
           {
              if (krt->HardKeys[data->keycode].repeat == EINA_FALSE)
                {
+                  g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
                   res = xkb_keymap_key_set_repeats(e_comp_wl->xkb.keymap, data->keycode, 0);
+                  g_mutex_unlock(&e_comp_wl->xkb.keymap_mutex);
                   if (!res)
                     {
                        KLWRN("Failed to set repeat key(%d), value(%d)", data->keycode, 0);