[mutter/wip/carlosg/input-thread: 100/130] 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: 100/130] clutter: Switch to GAsyncQueue for ClutterMainContext event queue
- Date: Sat, 21 Nov 2020 18:41:52 +0000 (UTC)
commit 08248bf3f0f054f54a855d9381bd07173e2ac29d
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 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]