Add mutex for key list 91/295191/2
authorJihoon Kim <jihoon48.kim@samsung.com>
Mon, 5 Jun 2023 07:20:57 +0000 (16:20 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Tue, 4 Jul 2023 07:32:27 +0000 (07:32 +0000)
Change-Id: I3d415f36c919a4f5b24b9e90850e202c31550142
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
src/bin/e_comp.h
src/bin/e_comp_wl.c
src/bin/e_comp_wl.h
src/bin/e_comp_wl_input.c

index 7e82a10..de37f86 100644 (file)
@@ -1,4 +1,6 @@
 #ifdef E_TYPEDEFS
+#include <glib.h>
+
 typedef struct _E_Comp                       E_Comp;
 typedef struct _E_Comp_Wl_Client_Data        E_Comp_Client_Data;  // deprecated. use E_Comp_Wl_Client_Data intead of this.
 typedef struct _E_Comp_Wl_Data               E_Comp_Wl_Data;
@@ -188,6 +190,8 @@ struct _E_Comp
       char use; // 0: none 1: use commit_handler timer
       double interval; // time value the interval of commit_handler after tdm_commit in second (default : 0)
    } commit_handler_timer;
+
+   GMutex          input_key_grabs_mutex;
 };
 
 struct _E_Comp_Connected_Client_Info
index 2c2a48e..225acae 100644 (file)
@@ -1900,6 +1900,7 @@ _e_comp_wl_evas_cb_focus_in_timer(E_Client *ec)
    t = ecore_time_unix_get();
 
    g_mutex_lock(&e_comp_wl->kbd.focused_mutex);
+   g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
    EINA_LIST_FOREACH(e_comp_wl->kbd.focused, l, res)
      {
         wl_array_for_each(k, &e_comp_wl->kbd.keys)
@@ -1909,6 +1910,7 @@ _e_comp_wl_evas_cb_focus_in_timer(E_Client *ec)
                                   k->key, WL_KEYBOARD_KEY_STATE_PRESSED);
           }
      }
+   g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
    g_mutex_unlock(&e_comp_wl->kbd.focused_mutex);
    return EINA_FALSE;
 }
@@ -2001,9 +2003,12 @@ _e_comp_wl_evas_cb_focus_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *ob
 
 
    /* update keyboard modifier state */
+   g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
    wl_array_for_each(k, &e_comp_wl->kbd.keys)
       e_comp_wl_input_keyboard_state_update(k->key, EINA_FALSE);
 
+   g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
+
    if (!ec->comp_data->surface) return;
 
    g_mutex_lock(&e_comp_wl->kbd.resource_mutex);
@@ -2020,6 +2025,7 @@ _e_comp_wl_evas_cb_focus_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *ob
    t = ecore_time_unix_get();
 
    g_mutex_lock(&e_comp_wl->kbd.focused_mutex);
+   g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
    EINA_LIST_FOREACH_SAFE(e_comp_wl->kbd.focused, l, ll, res)
      {
         wl_array_for_each(k, &e_comp_wl->kbd.keys)
@@ -2032,6 +2038,7 @@ _e_comp_wl_evas_cb_focus_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *ob
         e_comp_wl->kbd.focused =
            eina_list_remove_list(e_comp_wl->kbd.focused, l);
      }
+   g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
    g_mutex_unlock(&e_comp_wl->kbd.focused_mutex);
 }
 
@@ -4619,8 +4626,6 @@ e_comp_wl_init(void)
    if (!e_foreign_global_init(e_comp_wl->wl.disp))
      ELOGF("COMP", "Failed to initialize the e_foreign global", NULL);
 
-   g_mutex_init(&_wl_display_mutex);
-
    /* prepend a mouse move event handler to prevent the mouse move event from being delivered to
       the other mouse move event handlers when a pointer constraint is activated */
    E_LIST_HANDLER_PREPEND(handlers, ECORE_EVENT_MOUSE_MOVE, _e_comp_wl_cb_mouse_move_preventer, NULL);
@@ -5280,6 +5285,8 @@ e_comp_wl_key_down(Ecore_Event_Key *ev, E_Device *dev)
      }
 #endif
 
+   g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
+
    end = (E_Comp_Wl_Key_Data *)e_comp_wl->kbd.keys.data + (e_comp_wl->kbd.keys.size / sizeof(*k));
 
    for (k = e_comp_wl->kbd.keys.data; k < end; k++)
@@ -5287,10 +5294,13 @@ e_comp_wl_key_down(Ecore_Event_Key *ev, E_Device *dev)
         /* ignore server-generated key repeats */
         if (k->key == keycode)
           {
+             g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
              return EINA_FALSE;
           }
      }
 
+   g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
+
    if ((!e_client_action_get()) && (!e_comp->input_key_grabs))
      {
         ec = e_client_focused_get();
@@ -5302,13 +5312,17 @@ e_comp_wl_key_down(Ecore_Event_Key *ev, E_Device *dev)
                   _e_comp_wl_key_send(ev, dev, WL_KEYBOARD_KEY_STATE_PRESSED, e_comp_wl->kbd.focused, ec);
 
                   /* A key only sent to clients is added to the list */
+                  g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
                   e_comp_wl->kbd.keys.size = (const char *)end - (const char *)e_comp_wl->kbd.keys.data;
+
                   if (!(k = wl_array_add(&e_comp_wl->kbd.keys, sizeof(*k))))
                     {
                        DBG("wl_array_add: Out of memory\n");
+                       g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
                        g_mutex_unlock(&e_comp_wl->kbd.focused_mutex);
                        return EINA_FALSE;
                     }
+                  g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
                   k->key = keycode;
                   k->dev = ev->dev;
                }
@@ -5341,6 +5355,8 @@ e_comp_wl_key_up(Ecore_Event_Key *ev, E_Device *dev)
         return EINA_FALSE;
      }
 
+   g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
+
    end = (E_Comp_Wl_Key_Data *)e_comp_wl->kbd.keys.data + (e_comp_wl->kbd.keys.size / sizeof(*k));
    for (k = e_comp_wl->kbd.keys.data; k < end; k++)
      {
@@ -5354,7 +5370,10 @@ e_comp_wl_key_up(Ecore_Event_Key *ev, E_Device *dev)
    e_comp_wl->kbd.keys.size =
      (const char *)end - (const char *)e_comp_wl->kbd.keys.data;
 
+   g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
+
    /* If a key down event have been sent to clients, send a key up event to client for garantee key event sequence pair. (down/up) */
+   g_mutex_lock(&e_comp->input_key_grabs_mutex);
    if ((delivered_key) ||
        ((!e_client_action_get()) && (!e_comp->input_key_grabs)))
      {
@@ -5367,6 +5386,7 @@ e_comp_wl_key_up(Ecore_Event_Key *ev, E_Device *dev)
           }
         g_mutex_unlock(&e_comp_wl->kbd.focused_mutex);
      }
+   g_mutex_unlock(&e_comp->input_key_grabs_mutex);
 
    /* update modifier state */
    e_comp_wl_input_keyboard_state_update(keycode, EINA_FALSE);
index bd61b4f..b8d0153 100644 (file)
@@ -228,8 +228,9 @@ struct _E_Comp_Wl_Data
         int repeat_rate;
         unsigned int num_devices;
         GMutex mod_changed_mutex;
-        GMutex resource_mutex;
-        GMutex focused_mutex;
+        GMutex resource_mutex; /* for resources variable */
+        GMutex focused_mutex; /* for focused variable */
+        GMutex keys_mutex; /* for keys variable */
      } kbd;
 
    struct
index 1599fe0..7c8b39a 100644 (file)
@@ -349,6 +349,7 @@ e_comp_wl_input_keyboard_enter_send(E_Client *ec)
    g_mutex_lock(&ec->comp_data->surface_mutex);
    g_mutex_lock(&e_comp_wl->kbd.mod_changed_mutex);
    g_mutex_lock(&e_comp_wl->kbd.focused_mutex);
+   g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
    EINA_LIST_FOREACH(e_comp_wl->kbd.focused, l, res)
      {
         wl_keyboard_send_enter(res, serial, ec->comp_data->surface,
@@ -359,6 +360,7 @@ e_comp_wl_input_keyboard_enter_send(E_Client *ec)
                                    e_comp_wl->kbd.mod_locked,
                                    e_comp_wl->kbd.mod_group);
      }
+   g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
    g_mutex_unlock(&e_comp_wl->kbd.focused_mutex);
    g_mutex_unlock(&e_comp_wl->kbd.mod_changed_mutex);
    g_mutex_unlock(&ec->comp_data->surface_mutex);
@@ -1403,6 +1405,7 @@ e_comp_wl_input_init(void)
    g_mutex_init(&e_comp_wl->kbd.mod_changed_mutex);
    g_mutex_init(&e_comp_wl->kbd.resource_mutex);
    g_mutex_init(&e_comp_wl->kbd.focused_mutex);
+   g_mutex_init(&e_comp_wl->kbd.keys_mutex);
 
    g_mutex_init(&e_comp_wl->xkb.keymap_mutex);
    g_mutex_init(&e_comp_wl->xkb.state_mutex);
@@ -1461,8 +1464,10 @@ e_comp_wl_input_init(void)
                                              _e_comp_wl_input_cb_surface_commit,
                                              NULL);
 
-
+   g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
    wl_array_init(&e_comp_wl->kbd.keys);
+   g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
+
    wl_array_init(&e_comp_wl->kbd.routed_keys);
 
    E_EVENT_TEXT_INPUT_PANEL_VISIBILITY_CHANGE = ecore_event_type_new();
@@ -1529,7 +1534,10 @@ e_comp_wl_input_shutdown(void)
      wl_resource_destroy(res);
 
    /* destroy e_comp_wl->kbd.keys array */
+   g_mutex_lock(&e_comp_wl->kbd.keys_mutex);
    wl_array_release(&e_comp_wl->kbd.keys);
+   g_mutex_unlock(&e_comp_wl->kbd.keys_mutex);
+
    wl_array_release(&e_comp_wl->kbd.routed_keys);
 
    /* unmap any existing keyboard area */
@@ -1574,6 +1582,8 @@ e_comp_wl_input_shutdown(void)
 
    g_mutex_clear(&e_comp_wl->xkb.keymap_mutex);
    g_mutex_clear(&e_comp_wl->xkb.state_mutex);
+
+   g_mutex_clear(&e_comp_wl->kbd.keys_mutex);
 }
 
 EINTERN Eina_Bool