[mutter/wip/carlosg/input-thread: 60/90] clutter: Switch to GAsyncQueue for ClutterMainContext event queue




commit 96f1264439a06a5fbb86a0313b8085f86f1df35a
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Aug 11 19:01:12 2020 +0200

    clutter: Switch to GAsyncQueue for ClutterMainContext event queue
    
    We will be moving to having events produced in one thread and consumed
    in another. Make this an async event queue in preparation for that.

 clutter/clutter/clutter-event.c   | 20 ++++++--------------
 clutter/clutter/clutter-main.c    | 19 +++++++++++--------
 clutter/clutter/clutter-private.h |  2 +-
 3 files changed, 18 insertions(+), 23 deletions(-)
---
diff --git a/clutter/clutter/clutter-event.c b/clutter/clutter/clutter-event.c
index ac1d2cfd34..cc8741221b 100644
--- a/clutter/clutter/clutter-event.c
+++ b/clutter/clutter/clutter-event.c
@@ -1445,14 +1445,11 @@ ClutterEvent *
 clutter_event_get (void)
 {
   ClutterMainContext *context = _clutter_context_get_default ();
+  ClutterEvent *event;
 
-  if (context->events_queue == NULL)
-    return NULL;
+  event = g_async_queue_try_pop (context->events_queue);
 
-  if (g_queue_is_empty (context->events_queue))
-    return NULL;
-
-  return g_queue_pop_tail (context->events_queue);
+  return event;
 }
 
 void
@@ -1463,9 +1460,6 @@ _clutter_event_push (const ClutterEvent *event,
 
   g_assert (context != NULL);
 
-  if (context->events_queue == NULL)
-    context->events_queue = g_queue_new ();
-
   if (do_copy)
     {
       ClutterEvent *copy;
@@ -1474,7 +1468,8 @@ _clutter_event_push (const ClutterEvent *event,
       event = copy;
     }
 
-  g_queue_push_head (context->events_queue, (gpointer) event);
+  g_async_queue_push (context->events_queue, (gpointer) event);
+  g_main_context_wakeup (NULL);
 }
 
 /**
@@ -1511,10 +1506,7 @@ clutter_events_pending (void)
 
   g_return_val_if_fail (context != NULL, FALSE);
 
-  if (context->events_queue == NULL)
-    return FALSE;
-
-  return g_queue_is_empty (context->events_queue) == FALSE;
+  return g_async_queue_length (context->events_queue) > 0;
 }
 
 /**
diff --git a/clutter/clutter/clutter-main.c b/clutter/clutter/clutter-main.c
index 706fb430ac..0509e47964 100644
--- a/clutter/clutter/clutter-main.c
+++ b/clutter/clutter/clutter-main.c
@@ -697,6 +697,8 @@ _clutter_context_get_default (void)
       ctx->settings = clutter_settings_get_default ();
       _clutter_settings_set_backend (ctx->settings, ctx->backend);
 
+      ctx->events_queue = g_async_queue_new ();
+
       ctx->last_repaint_id = 1;
     }
 
@@ -2286,15 +2288,16 @@ void
 _clutter_clear_events_queue (void)
 {
   ClutterMainContext *context = _clutter_context_get_default ();
+  ClutterEvent *event;
 
-  if (context->events_queue != NULL)
-    {
-      g_queue_foreach (context->events_queue,
-                       (GFunc) clutter_event_free,
-                       NULL);
-      g_queue_free (context->events_queue);
-      context->events_queue = NULL;
-    }
+  /* Lock the queue for as long as it lives */
+  g_async_queue_lock (context->events_queue);
+
+  while ((event = g_async_queue_try_pop_unlocked (context->events_queue)))
+    clutter_event_free (event);
+
+  g_async_queue_unref (context->events_queue);
+  context->events_queue = NULL;
 }
 
 /**
diff --git a/clutter/clutter/clutter-private.h b/clutter/clutter/clutter-private.h
index 08a8c3f8c2..4c6f32282b 100644
--- a/clutter/clutter/clutter-private.h
+++ b/clutter/clutter/clutter-private.h
@@ -121,7 +121,7 @@ struct _ClutterMainContext
   ClutterStageManager *stage_manager;
 
   /* the main event queue */
-  GQueue *events_queue;
+  GAsyncQueue *events_queue;
 
   /* the event filters added via clutter_event_add_filter. these are
    * ordered from least recently added to most recently added */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]