[mutter/wip/carlosg/input-thread: 67/76] clutter: Switch to GAsyncQueue for ClutterMainContext event queue
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/carlosg/input-thread: 67/76] clutter: Switch to GAsyncQueue for ClutterMainContext event queue
- Date: Thu, 12 Nov 2020 22:17:49 +0000 (UTC)
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]