e_input: call libinput function in only input thread 99/302599/1
authorJihoon Kim <jihoon48.kim@samsung.com>
Wed, 6 Dec 2023 11:46:21 +0000 (20:46 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Mon, 11 Dec 2023 06:06:03 +0000 (15:06 +0900)
Prevent data race when using libinput library

Change-Id: Ia449371041fab8af857f562a92b304229793cc8b
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
src/bin/e_input.h
src/bin/e_input_device.c
src/bin/e_input_inputs.c

index 9a046db..f5c9a80 100644 (file)
@@ -173,5 +173,8 @@ EINTERN void e_input_flush_keyboard_share_events(void);
 E_API pid_t e_input_thread_id_get();
 EINTERN void e_input_thread_id_set(pid_t tid);
 
+EINTERN void e_input_thread_run(E_Input_Backend *input);
+EINTERN Eina_Bool e_input_libinput_context_create(E_Input_Backend *input);
+
 #endif
 #endif
index 46f536f..92bff79 100644 (file)
@@ -890,6 +890,12 @@ e_input_device_input_create_libinput_udev(E_Input_Device *dev)
      }
    E_FREE(env);
 
+   if (e_input_thread_mode_get())
+     {
+        e_input_thread_run(input);
+        return EINA_TRUE;
+     }
+
    if (e_input_thread_enabled_get())
      {
         /* initialize libinput udev backend within an ecore thread */
@@ -902,54 +908,67 @@ e_input_device_input_create_libinput_udev(E_Input_Device *dev)
         return EINA_TRUE;
      }
 
+   if (!e_input_libinput_context_create(input))
+     goto err;
+
+   /* enable this input */
+   if (!e_input_enable_input(input))
+     {
+        ERR("Failed to enable input");
+        goto err;
+     }
+
+   /* append this input */
+   dev->inputs = eina_list_append(dev->inputs, input);
+
+   /* process pending events */
+   _input_events_process(input);
+
+   return EINA_TRUE;
+
+err:
+   if (input->libinput) libinput_unref(input->libinput);
+   free(input);
+
+   return EINA_FALSE;
+}
+
+EINTERN Eina_Bool
+e_input_libinput_context_create(E_Input_Backend *input)
+{
    /* try to create libinput context */
    input->libinput =
      libinput_udev_create_context(&_input_interface, input, eeze_udev_get());
    if (!input->libinput)
      {
         ERR("Could not create libinput context: %m");
-        goto err;
+        return EINA_FALSE;
      }
 
+   if (!input->dev)
+     return EINA_FALSE;
+
    if (input->log_disable)
      libinput_log_set_handler(input->libinput, NULL);
    else
      {
         if (input->log_use_eina)
           libinput_log_set_handler(input->libinput, _libinput_log_handler);
+
         libinput_log_set_priority(input->libinput, LIBINPUT_LOG_PRIORITY_INFO);
      }
 
    /* assign udev seat */
    TRACE_INPUT_BEGIN(libinput_udev_assign_seat);
-   if (libinput_udev_assign_seat(input->libinput, dev->seat) != 0)
+   if (libinput_udev_assign_seat(input->libinput, input->dev->seat) != 0)
      {
         ERR("Failed to assign seat: %m");
         TRACE_INPUT_END();
-        goto err;
+        return EINA_FALSE;
      }
    TRACE_INPUT_END();
 
-   /* enable this input */
-   if (!e_input_enable_input(input))
-     {
-        ERR("Failed to enable input");
-        goto err;
-     }
-
-   /* append this input */
-   dev->inputs = eina_list_append(dev->inputs, input);
-
-   /* process pending events */
-   _input_events_process(input);
-
    return EINA_TRUE;
-
-err:
-   if (input->libinput) libinput_unref(input->libinput);
-   free(input);
-
-   return EINA_FALSE;
 }
 
 static void
index be014f0..5b91a95 100644 (file)
@@ -688,6 +688,7 @@ input_dispatch(GSource *source, GSourceFunc callback, gpointer user_data)
 static void
 input_thread_start(void *data, Ecore_Thread *th)
 {
+   E_Input_Device *dev;
    E_Input_Backend *input;
    GMainContext *context = NULL;
    InputEventSource *input_event_source = NULL;
@@ -696,6 +697,19 @@ input_thread_start(void *data, Ecore_Thread *th)
 
    eina_thread_name_set(eina_thread_self(), "input-thread");
 
+   e_input_libinput_context_create(input);
+
+   /* enable this input */
+   if (!e_input_enable_input(input))
+     {
+        ERR("Failed to enable input");
+        return;
+     }
+
+   /* append this input */
+   dev = input->dev;
+   dev->inputs = eina_list_append(dev->inputs, input);
+
    //create a context
    context = g_main_context_new();
    g_main_context_push_thread_default(context);
@@ -715,9 +729,6 @@ input_thread_start(void *data, Ecore_Thread *th)
    g_source_set_callback(&input_event_source->gsource, NULL, input, NULL);
    g_source_attach(&input_event_source->gsource, context);
 
-   input->enabled = EINA_TRUE;
-   input->suspended = EINA_FALSE;
-
    e_keyrouter_input_handler_add();
 
    e_input_thread_id_set(gettid());
@@ -802,26 +813,22 @@ e_input_enable_input(E_Input_Backend *input)
                 ecore_main_fd_handler_add(input->fd, ECORE_FD_READ,
                                           _cb_input_dispatch, input, NULL, NULL);
           }
+     }
 
-        if (input->suspended)
-          {
-             if (libinput_resume(input->libinput) != 0)
-               goto err;
-
-             input->suspended = EINA_FALSE;
-
-             /* process pending events */
-             _input_events_process(input);
-          }
+   if (input->suspended)
+     {
+        if (libinput_resume(input->libinput) != 0)
+          goto err;
 
-        input->enabled = EINA_TRUE;
         input->suspended = EINA_FALSE;
-     }
-   else
-     {
-        input->input_thread = ecore_thread_feedback_run(input_thread_start, input_thread_feedback, input_thread_end, input_thread_cancel, input, EINA_FALSE);
+
+        /* process pending events */
+        _input_events_process(input);
      }
 
+   input->enabled = EINA_TRUE;
+   input->suspended = EINA_FALSE;
+
    return EINA_TRUE;
 
 err:
@@ -886,3 +893,8 @@ e_input_create_event_source(E_Input_Backend *input)
 
    g_input_event_source = input->event_source;
 }
+
+EINTERN void e_input_thread_run(E_Input_Backend *input)
+{
+   input->input_thread = ecore_thread_feedback_run(input_thread_start, input_thread_feedback, input_thread_end, input_thread_cancel, input, EINA_FALSE);
+}