Add mutex for xkb_state variable 90/295190/2
authorJihoon Kim <jihoon48.kim@samsung.com>
Mon, 5 Jun 2023 05:56:06 +0000 (14:56 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Tue, 4 Jul 2023 07:32:23 +0000 (07:32 +0000)
Change-Id: Ia60f3a39401ce7faba5a288a8d3d9144615fa1f7
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_input_device.c
src/bin/e_input_evdev.c
src/bin/e_input_private.h

index ae53bc9..bd61b4f 100644 (file)
@@ -341,6 +341,7 @@ struct _E_Comp_Wl_Data
         size_t size;
         char *area;
         GMutex keymap_mutex;
+        GMutex state_mutex;
      } xkb;
 
    struct
index 49026e6..1599fe0 100644 (file)
@@ -1297,6 +1297,7 @@ _e_comp_wl_input_keymap_update(struct xkb_keymap *keymap, const char *keymap_pat
    if (e_comp_wl->xkb.fd >= 0) close(e_comp_wl->xkb.fd);
 
    /* unreference any existing keyboard state */
+   g_mutex_lock(&e_comp_wl->xkb.state_mutex);
    if (e_comp_wl->xkb.state)
      {
         latched =
@@ -1314,12 +1315,18 @@ _e_comp_wl_input_keymap_update(struct xkb_keymap *keymap, const char *keymap_pat
    /* create a new xkb state */
    e_comp_wl->xkb.state = xkb_state_new(keymap);
 
-   if (!e_comp_wl->xkb.state) return;
+   if (!e_comp_wl->xkb.state)
+     {
+        g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
+        return;
+     }
 
    if ((latched) || (locked) || (group))
      xkb_state_update_mask(e_comp_wl->xkb.state, 0,
                            latched, locked, 0, 0, group);
 
+   g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
+
    /* increment keymap reference */
    g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
    e_comp_wl->xkb.keymap = keymap;
@@ -1398,6 +1405,7 @@ e_comp_wl_input_init(void)
    g_mutex_init(&e_comp_wl->kbd.focused_mutex);
 
    g_mutex_init(&e_comp_wl->xkb.keymap_mutex);
+   g_mutex_init(&e_comp_wl->xkb.state_mutex);
 
    /* get default keyboard repeat rate/delay from configuration */
    e_comp_wl->kbd.repeat_delay = e_config->keyboard.repeat_delay;
@@ -1530,9 +1538,12 @@ e_comp_wl_input_shutdown(void)
    if (e_comp_wl->xkb.fd >= 0) close(e_comp_wl->xkb.fd);
 
    /* unreference any existing keyboard state */
+   g_mutex_lock(&e_comp_wl->xkb.state_mutex);
    if (e_comp_wl->xkb.state)
      xkb_state_unref(e_comp_wl->xkb.state);
 
+   g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
+
    /* unreference any existing keymap */
    g_mutex_lock(&e_comp_wl->xkb.keymap_mutex);
    if (e_comp_wl->xkb.keymap)
@@ -1562,6 +1573,7 @@ e_comp_wl_input_shutdown(void)
    dont_use_xkb_cache = EINA_FALSE;
 
    g_mutex_clear(&e_comp_wl->xkb.keymap_mutex);
+   g_mutex_clear(&e_comp_wl->xkb.state_mutex);
 }
 
 EINTERN Eina_Bool
@@ -1593,6 +1605,7 @@ e_comp_wl_input_keyboard_modifiers_serialize(void)
    xkb_layout_index_t grp;
 
    g_mutex_lock(&e_comp_wl->kbd.mod_changed_mutex);
+   g_mutex_lock(&e_comp_wl->xkb.state_mutex);
 
    mod = xkb_state_serialize_mods(e_comp_wl->xkb.state,
                               XKB_STATE_DEPRESSED);
@@ -1614,6 +1627,7 @@ e_comp_wl_input_keyboard_modifiers_serialize(void)
    changed |= grp != e_comp_wl->kbd.mod_group;
    e_comp_wl->kbd.mod_group = grp;
 
+   g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
    g_mutex_unlock(&e_comp_wl->kbd.mod_changed_mutex);
 
    return changed;
@@ -1654,7 +1668,12 @@ e_comp_wl_input_keyboard_state_update(uint32_t keycode, Eina_Bool pressed)
 {
    enum xkb_key_direction dir;
 
-   if (!e_comp_wl->xkb.state) return;
+   g_mutex_lock(&e_comp_wl->xkb.state_mutex);
+   if (!e_comp_wl->xkb.state)
+     {
+        g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
+        return;
+     }
 
    if (pressed) dir = XKB_KEY_DOWN;
    else dir = XKB_KEY_UP;
@@ -1662,6 +1681,8 @@ e_comp_wl_input_keyboard_state_update(uint32_t keycode, Eina_Bool pressed)
    e_comp_wl->kbd.mod_changed =
      xkb_state_update_key(e_comp_wl->xkb.state, keycode + 8, dir);
 
+   g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
+
    e_comp_wl_input_keyboard_modifiers_update();
 }
 
@@ -2073,7 +2094,10 @@ e_comp_wl_input_keymap_keycode_to_keyname(int keycode)
    EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl->xkb.state, NULL);
 
+   g_mutex_lock(&e_comp_wl->xkb.state_mutex);
    state = e_comp_wl->xkb.state;
+   g_mutex_unlock(&e_comp_wl->xkb.state_mutex);
+
    sym = xkb_state_key_get_one_sym(state, keycode);
    if (sym == XKB_KEY_NoSymbol)
      {
index 9ac9d65..14c845e 100644 (file)
@@ -116,8 +116,11 @@ _e_input_device_cached_keymap_update(struct xkb_keymap *map)
             xkb_keymap_unref(edev->xkb.keymap);
             edev->xkb.keymap = xkb_keymap_ref(map);
             g_mutex_unlock(&edev->xkb.keymap_mutex);
+
+            g_mutex_lock(&edev->xkb.state_mutex);
             xkb_state_unref(edev->xkb.state);
             edev->xkb.state = xkb_state_new(map);
+            g_mutex_unlock(&edev->xkb.state_mutex);
          }
 }
 
index d6de7cf..e119e23 100644 (file)
@@ -225,13 +225,18 @@ _device_keyboard_setup(E_Input_Evdev *edev)
 
    g_mutex_unlock(&edev->xkb.keymap_mutex);
 
+   g_mutex_lock(&edev->xkb.state_mutex);
+
    /* create xkb state */
    if (!(edev->xkb.state = xkb_state_new(edev->xkb.keymap)))
      {
+        g_mutex_unlock(&edev->xkb.state_mutex);
         ERR("Failed to create xkb state: %m");
         return;
      }
 
+   g_mutex_unlock(&edev->xkb.state_mutex);
+
    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)
@@ -333,6 +338,8 @@ _device_modifiers_update_device(E_Input_Evdev *edev, E_Input_Evdev *from)
 {
    xkb_mod_mask_t mask;
 
+   g_mutex_lock(&from->xkb.state_mutex);
+
    edev->xkb.depressed =
      xkb_state_serialize_mods(from->xkb.state, XKB_STATE_DEPRESSED);
    edev->xkb.latched =
@@ -342,6 +349,8 @@ _device_modifiers_update_device(E_Input_Evdev *edev, E_Input_Evdev *from)
    edev->xkb.group =
      xkb_state_serialize_mods(from->xkb.state, XKB_STATE_EFFECTIVE);
 
+   g_mutex_unlock(&from->xkb.state_mutex);
+
    mask = (edev->xkb.depressed | edev->xkb.latched);
 
    if (mask & from->xkb.ctrl_mask)
@@ -647,11 +656,14 @@ _device_handle_key(struct libinput_device *device, struct libinput_event_keyboar
         return;
      }
 
+   g_mutex_lock(&edev->xkb.state_mutex);
    xkb_state_update_key(edev->xkb.state, code,
                         (state ? XKB_KEY_DOWN : XKB_KEY_UP));
 
    /* get the keysym for this code */
    nsyms = xkb_key_get_syms(edev->xkb.state, code, &syms);
+   g_mutex_unlock(&edev->xkb.state_mutex);
+
    if (nsyms == 1) sym = syms[0];
 
    /* If no keysym was found, name it "Keycode-NNN" */
@@ -675,6 +687,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);
+   g_mutex_lock(&edev->xkb.state_mutex);
    if (xkb_state_mod_index_is_active(edev->xkb.state,
                                      xkb_map_mod_get_index(edev->xkb.keymap,
                                      XKB_MOD_NAME_SHIFT),
@@ -684,6 +697,7 @@ _device_handle_key(struct libinput_device *device, struct libinput_event_keyboar
           keyname[0] = tolower(keyname[0]);
      }
    g_mutex_unlock(&edev->xkb.keymap_mutex);
+   g_mutex_unlock(&edev->xkb.state_mutex);
 
    if (_device_keysym_translate(sym, edev->xkb.modifiers,
                                 compose_buffer, sizeof(compose_buffer)))
@@ -2202,7 +2216,10 @@ _e_input_evdev_device_destroy(E_Input_Evdev *edev)
 
    if (edev->caps & E_INPUT_SEAT_KEYBOARD)
      {
+        g_mutex_lock(&edev->xkb.state_mutex);
         if (edev->xkb.state) xkb_state_unref(edev->xkb.state);
+        g_mutex_unlock(&edev->xkb.state_mutex);
+
         g_mutex_lock(&edev->xkb.keymap_mutex);
         if (edev->xkb.keymap) xkb_map_unref(edev->xkb.keymap);
         g_mutex_unlock(&edev->xkb.keymap_mutex);
index 5a86a30..3cc357c 100644 (file)
@@ -115,6 +115,7 @@ struct _E_Input_Evdev
 
         Eina_List *pressed_keys;
         GMutex keymap_mutex;
+        GMutex state_mutex;
      } xkb;
 
      Eina_Hash *key_remap_hash;