From 393503ba5bdc7c09cd46b716aaf3d2c63a6c7f9c Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Sat, 8 Feb 2014 12:23:46 +0000 Subject: [PATCH] gmain: simplify g_main_context_find_source_by_id() Since we now keep a hashtable of sources, we can implement this function without iteration. https://bugzilla.gnome.org/show_bug.cgi?id=724839 --- glib/gmain.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/glib/gmain.c b/glib/gmain.c index 404833d94..45ed40250 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -2039,37 +2039,30 @@ g_source_unref (GSource *source) /** * g_main_context_find_source_by_id: * @context: (allow-none): a #GMainContext (if %NULL, the default context will be used) - * @source_id: the source ID, as returned by g_source_get_id(). - * + * @source_id: the source ID, as returned by g_source_get_id(). + * * Finds a #GSource given a pair of context and ID. - * + * * Returns: (transfer none): the #GSource if found, otherwise, %NULL **/ GSource * g_main_context_find_source_by_id (GMainContext *context, - guint source_id) + guint source_id) { - GSourceIter iter; GSource *source; - + g_return_val_if_fail (source_id > 0, NULL); if (context == NULL) context = g_main_context_default (); - - LOCK_CONTEXT (context); - - g_source_iter_init (&iter, context, FALSE); - while (g_source_iter_next (&iter, &source)) - { - if (!SOURCE_DESTROYED (source) && - source->source_id == source_id) - break; - } - g_source_iter_clear (&iter); + LOCK_CONTEXT (context); + source = g_hash_table_lookup (context->sources, GUINT_TO_POINTER (source_id)); UNLOCK_CONTEXT (context); + if (source && SOURCE_DESTROYED (source)) + source = NULL; + return source; }