protect e_comp->layers with mutex 87/299987/1
authorJoonbum Ko <joonbum.ko@samsung.com>
Fri, 13 Oct 2023 04:01:35 +0000 (13:01 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 13 Oct 2023 07:52:00 +0000 (16:52 +0900)
 - Using e_comp->input_key_grabs_mutex

Change-Id: I54b117c40ca3534099876147f7036971c88fb859
Signed-off-by: Joonbum Ko <joonbum.ko@samsung.com>
src/bin/e_client.c
src/bin/e_comp_object.c

index dff60e1..dce655c 100644 (file)
@@ -5024,6 +5024,7 @@ e_client_above_get(const E_Client *ec)
    if (ec->layer == E_LAYER_CLIENT_CURSOR) return NULL;
    if (e_comp_canvas_client_layer_map(ec->layer) == 9999) return NULL;
 
+   g_mutex_lock(&e_comp->input_key_grabs_mutex);
    /* go up the layers until we find one */
    for (x = e_comp_canvas_layer_map(ec->layer) + 1; x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
      {
@@ -5037,9 +5038,14 @@ e_client_above_get(const E_Client *ec)
                   continue;
                }
              if (!e_object_is_del(E_OBJECT(ec2)))
-               return ec2;
+               {
+                  g_mutex_unlock(&e_comp->input_key_grabs_mutex);
+                  return ec2;
+               }
           }
      }
+   g_mutex_unlock(&e_comp->input_key_grabs_mutex);
+
    return NULL;
 }
 
@@ -5094,6 +5100,7 @@ e_client_below_get(const E_Client *ec)
    x = e_comp_canvas_layer_map(ec_layer);
    if (x > 0) x--;
 
+   g_mutex_lock(&e_comp->input_key_grabs_mutex);
    for (; x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
      {
         if (!e_comp->layers[x].clients) continue;
@@ -5106,9 +5113,14 @@ e_client_below_get(const E_Client *ec)
                   continue;
                }
              if (!e_object_is_del(E_OBJECT(ec2)))
-               return ec2;
+               {
+                  g_mutex_unlock(&e_comp->input_key_grabs_mutex);
+                  return ec2;
+               }
           }
      }
+   g_mutex_unlock(&e_comp->input_key_grabs_mutex);
+
    return NULL;
 }
 
@@ -5116,6 +5128,7 @@ E_API E_Client *
 e_client_bottom_get(void)
 {
    unsigned int x;
+   g_mutex_lock(&e_comp->input_key_grabs_mutex);
    for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x <= e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x++)
      {
         E_Client *ec2;
@@ -5123,8 +5136,13 @@ e_client_bottom_get(void)
         if (!e_comp->layers[x].clients) continue;
         EINA_INLIST_FOREACH(e_comp->layers[x].clients, ec2)
           if (!e_object_is_del(E_OBJECT(ec2)))
-            return ec2;
+            {
+               g_mutex_unlock(&e_comp->input_key_grabs_mutex);
+               return ec2;
+            }
      }
+   g_mutex_unlock(&e_comp->input_key_grabs_mutex);
+
    return NULL;
 }
 
@@ -5132,6 +5150,7 @@ E_API E_Client *
 e_client_top_get(void)
 {
    unsigned int x;
+   g_mutex_lock(&e_comp->input_key_grabs_mutex);
    for (x = e_comp_canvas_layer_map(E_LAYER_CLIENT_CURSOR); x >= e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); x--)
      {
         E_Client *ec2;
@@ -5139,8 +5158,13 @@ e_client_top_get(void)
         if (!e_comp->layers[x].clients) continue;
         EINA_INLIST_REVERSE_FOREACH(e_comp->layers[x].clients, ec2)
           if (!e_object_is_del(E_OBJECT(ec2)))
-            return ec2;
+            {
+               g_mutex_unlock(&e_comp->input_key_grabs_mutex);
+               return ec2;
+            }
      }
+   g_mutex_unlock(&e_comp->input_key_grabs_mutex);
+
    return NULL;
 }
 
index 23bd2c3..0282e87 100644 (file)
@@ -610,6 +610,7 @@ _e_comp_object_layers_add(E_Comp_Object *cw, E_Comp_Object *above, E_Comp_Object
    /* try to get the internal data for the layer;
     * will return NULL for fake layers (eg. wayland)
     */
+   g_mutex_lock(&e_comp->input_key_grabs_mutex);
    if (e_comp->layers[cw->layer].obj)
      {
         if (evas_object_smart_smart_get(e_comp->layers[cw->layer].obj))
@@ -630,14 +631,17 @@ _e_comp_object_layers_add(E_Comp_Object *cw, E_Comp_Object *above, E_Comp_Object
           e_comp->layers[cw->layer].clients = eina_inlist_append(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
      }
    e_comp->layers[cw->layer].clients_count++;
+   g_mutex_unlock(&e_comp->input_key_grabs_mutex);
 #ifndef E_RELEASE_BUILD
    if (layer_cw)
      {
         E_Client *below_ec = e_client_below_get(cw->ec);
         if (below_ec)
           {
+             g_mutex_lock(&e_comp->input_key_grabs_mutex);
              if (e_comp->layers[cw->layer].obj == below_ec->frame)
                CRI("ACK! ec:%p", cw->ec);
+             g_mutex_unlock(&e_comp->input_key_grabs_mutex);
           }
      }
 #endif
@@ -646,11 +650,13 @@ _e_comp_object_layers_add(E_Comp_Object *cw, E_Comp_Object *above, E_Comp_Object
 static void
 _e_comp_object_layers_remove(E_Comp_Object *cw)
 {
+   g_mutex_lock(&e_comp->input_key_grabs_mutex);
    if (cw->ec && e_comp->layers[cw->layer].clients)
      {
         e_comp->layers[cw->layer].clients = eina_inlist_remove(e_comp->layers[cw->layer].clients, EINA_INLIST_GET(cw->ec));
         e_comp->layers[cw->layer].clients_count--;
      }
+   g_mutex_unlock(&e_comp->input_key_grabs_mutex);
 /*
    e_comp->layers[cw->layer].objs = eina_inlist_remove(e_comp->layers[cw->layer].objs, EINA_INLIST_GET(cw));
    e_comp->layers[cw->layer].objs_count--;