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




commit 2562a1e888746e7e044890532bee1022a9662847
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.
    
    https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1403

 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 483d6ee935..65775a9201 100644
--- a/clutter/clutter/clutter-event.c
+++ b/clutter/clutter/clutter-event.c
@@ -1468,14 +1468,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
@@ -1486,9 +1483,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;
@@ -1497,7 +1491,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);
 }
 
 /**
@@ -1534,10 +1529,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 ca458db97b..3b48f12d11 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]