e_input_event: add mutex for input_event 02/313802/3
authorInhong Han <inhong1.han@samsung.com>
Tue, 2 Jul 2024 04:49:04 +0000 (13:49 +0900)
committerInhong Han <inhong1.han@samsung.com>
Wed, 3 Jul 2024 00:12:13 +0000 (09:12 +0900)
Change-Id: If6af96be38ee390fcbf149c35240cf790e318d3e

src/bin/e_input_event.c
src/bin/e_input_event.h

index adebc2153ae2bd05a6b7f7fe6bfe4fc9051d062e..90d6a085afea1f9e9214b5b8257a66ada53ec4df 100755 (executable)
@@ -60,6 +60,9 @@ e_input_event_source_create()
    source->ev_filter_list = NULL;
    source->data = NULL;
 
+   g_rec_mutex_init(&source->ev_handler_mutex);
+   g_rec_mutex_init(&source->ev_filter_mutex);
+
    return source;
 }
 
@@ -83,6 +86,9 @@ e_input_event_source_destroy(E_Input_Event_Source *source)
    g_queue_free(source->ev_queue);
    g_source_destroy(&source->gsource);
    g_source_unref(&source->gsource);
+
+   g_rec_mutex_clear(&source->ev_handler_mutex);
+   g_rec_mutex_clear(&source->ev_filter_mutex);
 }
 
 E_API E_Input_Event_Handler *
@@ -97,7 +103,9 @@ e_input_event_handler_add(E_Input_Event_Source *source, int event, ev_handler_fu
    eh->func = func;
    eh->user_data = user_data;
 
+   g_rec_mutex_lock(&source->ev_handler_mutex);
    source->ev_handler_list = g_list_append(source->ev_handler_list, eh);
+   g_rec_mutex_unlock(&source->ev_handler_mutex);
 
    return eh;
 }
@@ -114,7 +122,9 @@ e_input_event_handler_prepend(E_Input_Event_Source *source, int event, ev_handle
    eh->func = func;
    eh->user_data = user_data;
 
+   g_rec_mutex_lock(&source->ev_handler_mutex);
    source->ev_handler_list = g_list_prepend(source->ev_handler_list, eh);
+   g_rec_mutex_unlock(&source->ev_handler_mutex);
 
    return eh;
 }
@@ -124,8 +134,10 @@ e_input_event_handler_del(E_Input_Event_Source *source, E_Input_Event_Handler *e
 {
    if (!source) return;
 
+   g_rec_mutex_lock(&source->ev_handler_mutex);
    source->ev_handler_list = g_list_remove(source->ev_handler_list, event_handler);
    free(event_handler);
+   g_rec_mutex_unlock(&source->ev_handler_mutex);
 }
 
 E_API E_Input_Event_Filter *
@@ -140,7 +152,9 @@ e_input_event_filter_add(E_Input_Event_Source *source, int event, ev_handler_fun
    ef->func = func;
    ef->user_data = user_data;
 
+   g_rec_mutex_lock(&source->ev_filter_mutex);
    source->ev_filter_list = g_list_append(source->ev_filter_list, ef);
+   g_rec_mutex_unlock(&source->ev_filter_mutex);
 
    return ef;
 }
@@ -148,10 +162,12 @@ e_input_event_filter_add(E_Input_Event_Source *source, int event, ev_handler_fun
 E_API void
 e_input_event_filter_del(E_Input_Event_Source *source, E_Input_Event_Filter *event_filter)
 {
-   if (source)
-     source->ev_filter_list = g_list_remove(source->ev_filter_list, event_filter);
+   if (!source) return;
 
+   g_rec_mutex_lock(&source->ev_filter_mutex);
+   source->ev_filter_list = g_list_remove(source->ev_filter_list, event_filter);
    free(event_filter);
+   g_rec_mutex_unlock(&source->ev_filter_mutex);
 }
 
 static gboolean
@@ -163,6 +179,7 @@ _process_filter_event(E_Input_Event_Source *ev_source, E_Input_Event *ev)
 
    if (!ev_source || !ev) return TRUE;
 
+   g_rec_mutex_lock(&ev_source->ev_filter_mutex);
    l = ev_source->ev_filter_list;
    while (l)
      {
@@ -173,12 +190,16 @@ _process_filter_event(E_Input_Event_Source *ev_source, E_Input_Event *ev)
              if (ef->func)
                {
                   if (ef->func(ef->user_data, ef->event, ev->ev_data) == FALSE)
-                    return FALSE;
+                    {
+                       g_rec_mutex_unlock(&ev_source->ev_filter_mutex);
+                       return FALSE;
+                    }
                }
           }
 
         l = g_list_next(l);
      }
+   g_rec_mutex_unlock(&ev_source->ev_filter_mutex);
 
    return TRUE;
 }
@@ -192,6 +213,7 @@ _process_event_handler(E_Input_Event_Source *ev_source, E_Input_Event *ev)
 
    if (!ev_source || !ev) return TRUE;
 
+   g_rec_mutex_lock(&ev_source->ev_handler_mutex);
    l = ev_source->ev_handler_list;
    while (l)
      {
@@ -205,12 +227,16 @@ _process_event_handler(E_Input_Event_Source *ev_source, E_Input_Event *ev)
              if (eh->func)
                {
                   if (eh->func(eh->user_data, eh->event, ev->ev_data) == FALSE)
-                    return FALSE;
+                    {
+                       g_rec_mutex_unlock(&ev_source->ev_handler_mutex);
+                       return FALSE;
+                    }
                }
           }
 
         l = g_list_next(l);
      }
+   g_rec_mutex_unlock(&ev_source->ev_handler_mutex);
 
    return TRUE;
 }
index 960ad30dd7c588c37154f2472eae347d1ba4bb76..67400f4665fbd19c8ff50ef4c55b3d2f6beabe27 100755 (executable)
@@ -31,6 +31,9 @@ struct _e_input_event_source {
     GList *ev_handler_list;
     GList *ev_filter_list;
     GQueue *ev_queue;
+
+    GRecMutex ev_handler_mutex;
+    GRecMutex ev_filter_mutex;
 };
 
 struct _e_input_event {