From b789d38f680ec4b547143c66cbe18994b1d06796 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 11 Aug 2020 19:01:12 +0200 Subject: [PATCH] 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. Part-of: --- clutter/clutter/clutter-event.c | 20 ++++++-------------- clutter/clutter/clutter-main.c | 25 +++++++++++++++++-------- clutter/clutter/clutter-private.h | 2 +- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/clutter/clutter/clutter-event.c b/clutter/clutter/clutter-event.c index ac1d2cfd3..cc8741221 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 706fb430a..035ed9444 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,22 @@ void _clutter_clear_events_queue (void) { ClutterMainContext *context = _clutter_context_get_default (); + ClutterEvent *event; + GAsyncQueue *events_queue; - 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; - } + if (!context->events_queue) + return; + + g_async_queue_lock (context->events_queue); + + while ((event = g_async_queue_try_pop_unlocked (context->events_queue))) + clutter_event_free (event); + + events_queue = context->events_queue; + context->events_queue = NULL; + + g_async_queue_unlock (events_queue); + g_async_queue_unref (events_queue); } /** diff --git a/clutter/clutter/clutter-private.h b/clutter/clutter/clutter-private.h index 08a8c3f8c..4c6f32282 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 */