e_input_device: add mutex for blocked_client 60/299760/1
authorJihoon Kim <jihoon48.kim@samsung.com>
Tue, 26 Sep 2023 07:23:41 +0000 (16:23 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 10 Oct 2023 02:47:06 +0000 (11:47 +0900)
Change-Id: I24fb0af59e7ae6f38dac5b95118dd0a3dfebaeef
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
src/bin/e_input.h
src/bin/e_input_device.c
src/bin/e_input_evdev.c

index 57da8e5..9eaaac6 100644 (file)
@@ -90,6 +90,7 @@ struct _E_Input_Device
    unsigned int blocked;
    void *blocked_client;
    unsigned int server_blocked;
+   GMutex blocked_client_mutex;
 };
 
 EINTERN int e_input_init(Ecore_Evas *ee);
index 334fd33..6cf2d51 100644 (file)
@@ -236,6 +236,8 @@ e_input_device_open(void)
    dev->seat = eina_stringshare_add("seat0");
    dev->fd_hash = eina_hash_string_superfast_new(NULL);
 
+   g_mutex_init(&dev->blocked_client_mutex);
+
    /* try to create xkb context */
    if (!(dev->xkb_ctx = _e_input_device_cached_context_get(0)))
      {
@@ -268,6 +270,8 @@ e_input_device_close(E_Input_Device *dev)
    /* check for valid device */
    EINA_SAFETY_ON_NULL_RETURN_VAL(dev, EINA_FALSE);
 
+   g_mutex_clear(&dev->blocked_client_mutex);
+
    _e_input_device_remove_list(dev);
    e_input_device_destroy(dev);
 
@@ -1303,7 +1307,9 @@ e_input_device_block(E_Input_Device *dev, unsigned int type, void *client)
           }
 
         dev->blocked |= type;
+        g_mutex_lock(&dev->blocked_client_mutex);
         dev->blocked_client = client;
+        g_mutex_unlock(&dev->blocked_client_mutex);
      }
    else if (client == E_INPUT_REQUEST_SERVER)
      {
@@ -1335,7 +1341,7 @@ e_input_device_unblock(E_Input_Device *dev, void *client)
 
    if (client != E_INPUT_REQUEST_SERVER && dev->blocked_client != client)
      {
-        WRN("Currently %p client has already bloked (type: 0x%x)\n", dev->blocked_client, dev->blocked);
+        WRN("Currently %p client has already blocked (type: 0x%x)\n", dev->blocked_client, dev->blocked);
         return EINA_FALSE;
      }
 
@@ -1359,7 +1365,9 @@ e_input_device_unblock(E_Input_Device *dev, void *client)
    else
      {
         dev->blocked = 0x0;
+        g_mutex_lock(&dev->blocked_client_mutex);
         dev->blocked_client = NULL;
+        g_mutex_unlock(&dev->blocked_client_mutex);
      }
 
    return EINA_TRUE;
index 1c0aa6d..db8b6f7 100644 (file)
@@ -629,9 +629,11 @@ _device_handle_key(struct libinput_device *device, struct libinput_event_keyboar
         if ((edev->seat->dev->blocked & E_INPUT_SEAT_KEYBOARD) ||
             (edev->seat->dev->server_blocked & E_INPUT_SEAT_KEYBOARD))
           {
+             g_mutex_lock(&edev->seat->dev->blocked_client_mutex);
              ELOGF("Key", "Press (keycode: %d, device: %s) is blocked by %p, server: 0x%x", NULL,
                    code, device_name, edev->seat->dev->blocked_client,
                    edev->seat->dev->server_blocked);
+             g_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
              return;
           }
 
@@ -672,8 +674,10 @@ _device_handle_key(struct libinput_device *device, struct libinput_event_keyboar
           }
         if (!dup_found)
           {
+             g_mutex_lock(&edev->seat->dev->blocked_client_mutex);
              ELOGF("Key", "Release (keycode: %d, device: %s) is blocked by %p", NULL,
                    code, device_name, edev->seat->dev->blocked_client);
+             g_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
              return;
           }
      }
@@ -1172,9 +1176,11 @@ _device_handle_button(struct libinput_device *device, struct libinput_event_poin
         if ((edev->seat->dev->blocked & E_INPUT_SEAT_POINTER) ||
             (edev->seat->dev->server_blocked & E_INPUT_SEAT_POINTER))
           {
+             g_mutex_lock(&edev->seat->dev->blocked_client_mutex);
              ELOGF("Mouse", "Button Press (btn: %d, device: %s) is blocked by %p, server: 0x%x", NULL,
                    button, ecore_device_name_get(ecore_dev), edev->seat->dev->blocked_client,
                    edev->seat->dev->server_blocked);
+             g_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
              goto end;
           }
         else
@@ -1186,9 +1192,11 @@ _device_handle_button(struct libinput_device *device, struct libinput_event_poin
      {
         if (!(edev->mouse.pressed_button & (1 << button)))
           {
+             g_mutex_lock(&edev->seat->dev->blocked_client_mutex);
              ELOGF("Mouse", "Button Release (btn: %d, device: %s) is blocked by %p, server: 0x%x", NULL,
                    button, ecore_device_name_get(ecore_dev), edev->seat->dev->blocked_client,
                    edev->seat->dev->server_blocked);
+             g_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
              goto end;
           }
         edev->mouse.pressed_button &= ~(1 << button);
@@ -1398,12 +1406,16 @@ _device_handle_axis(struct libinput_device *device, struct libinput_event_pointe
    if ((edev->seat->dev->blocked & E_INPUT_SEAT_POINTER) ||
        (edev->seat->dev->server_blocked & E_INPUT_SEAT_POINTER))
      {
+        g_mutex_lock(&edev->seat->dev->blocked_client_mutex);
+
         if (detent_data)
           ELOGF("Mouse", "Detent (direction: %d, value: %d) is blocked by %p, server: 0x%x", NULL,
                 direction, z, edev->seat->dev->blocked_client, edev->seat->dev->server_blocked);
         else
           ELOGF("Mouse", "Wheel (direction: %d, value: %d) is blocked by %p, server: 0x%x", NULL,
                 direction, z, edev->seat->dev->blocked_client, edev->seat->dev->server_blocked);
+
+        g_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
         goto end;
      }
 
@@ -1579,12 +1591,15 @@ _device_handle_axis_v120(struct libinput_device *device, struct libinput_event_p
    if ((edev->seat->dev->blocked & E_INPUT_SEAT_POINTER) ||
        (edev->seat->dev->server_blocked & E_INPUT_SEAT_POINTER))
      {
+        g_mutex_lock(&edev->seat->dev->blocked_client_mutex);
         if (detent_data)
           ELOGF("Mouse", "Detent (direction: %d, value: %d) is blocked by %p, server: 0x%x", NULL,
                 direction, z, edev->seat->dev->blocked_client, edev->seat->dev->server_blocked);
         else
           ELOGF("Mouse", "Wheel (direction: %d, value: %d) is blocked by %p, server: 0x%x", NULL,
                 direction, z, edev->seat->dev->blocked_client, edev->seat->dev->server_blocked);
+
+        g_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
         goto end;
      }
 
@@ -2001,9 +2016,11 @@ _device_handle_touch_down(struct libinput_device *device, struct libinput_event_
 
    if (edev->touch.blocked)
      {
+        g_mutex_lock(&edev->seat->dev->blocked_client_mutex);
         ELOGF("Touch", "Down (id: %d, x: %d, y: %d) is blocked by %p, server: 0x%x", NULL,
               edev->mt_slot, edev->seat->ptr.ix, edev->seat->ptr.iy, edev->seat->dev->blocked_client,
               edev->seat->dev->server_blocked);
+        g_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
         return;
      }
 
@@ -2118,9 +2135,12 @@ _device_handle_touch_up(struct libinput_device *device, struct libinput_event_to
      {
         if (!(edev->touch.pressed & (1 << edev->mt_slot)))
           {
+             g_mutex_lock(&edev->seat->dev->blocked_client_mutex);
              ELOGF("Touch", "Up (id: %d, x: %d, y: %d) is blocked by %p, server(0x%x)", NULL,
                    edev->mt_slot, edev->seat->ptr.ix, edev->seat->ptr.iy, edev->seat->dev->blocked_client,
                    edev->seat->dev->server_blocked);
+             g_mutex_unlock(&edev->seat->dev->blocked_client_mutex);
+
              if (edev->touch.raw_pressed == 0x0)
                {
                   edev->touch.blocked = EINA_FALSE;