[glib] gmain: Warn when g_source_remove() fails



commit a919be3d39150328874ff647fb2c2be7af3df996
Author: Bastien Nocera <hadess hadess net>
Date:   Wed Oct 23 15:38:58 2013 +0200

    gmain: Warn when g_source_remove() fails
    
    Trying to remove a non-existent source should really be
    a programming error, as the programmer could be trying to
    use the wrong function to remove a callback, as seen when
    GtkScrolledWindow tried to remove ID from another function
    using g_source_remove().
    
    See https://bugzilla.gnome.org/show_bug.cgi?id=710666#c12
    
    https://bugzilla.gnome.org/show_bug.cgi?id=710724

 glib/gmain.c |   23 ++++++++++++++---------
 1 files changed, 14 insertions(+), 9 deletions(-)
---
diff --git a/glib/gmain.c b/glib/gmain.c
index a66739e..98603f7 100644
--- a/glib/gmain.c
+++ b/glib/gmain.c
@@ -2179,29 +2179,34 @@ g_main_context_find_source_by_user_data (GMainContext *context,
 /**
  * g_source_remove:
  * @tag: the ID of the source to remove.
- * 
- * Removes the source with the given id from the default main context. 
- * The id of
- * a #GSource is given by g_source_get_id(), or will be returned by the
- * functions g_source_attach(), g_idle_add(), g_idle_add_full(),
- * g_timeout_add(), g_timeout_add_full(), g_child_watch_add(),
- * g_child_watch_add_full(), g_io_add_watch(), and g_io_add_watch_full().
+ *
+ * Removes the source with the given id from the default main context.
+ *
+ * The id of a #GSource is given by g_source_get_id(), or will be
+ * returned by the functions g_source_attach(), g_idle_add(),
+ * g_idle_add_full(), g_timeout_add(), g_timeout_add_full(),
+ * g_child_watch_add(), g_child_watch_add_full(), g_io_add_watch(), and
+ * g_io_add_watch_full().
  *
  * See also g_source_destroy(). You must use g_source_destroy() for sources
  * added to a non-default main context.
  *
- * Return value: %TRUE if the source was found and removed.
+ * It is a programmer error to attempt to remove a non-existent source.
+ *
+ * Return value: For historical reasons, this function always returns %TRUE
  **/
 gboolean
 g_source_remove (guint tag)
 {
   GSource *source;
-  
+
   g_return_val_if_fail (tag > 0, FALSE);
 
   source = g_main_context_find_source_by_id (NULL, tag);
   if (source)
     g_source_destroy (source);
+  else
+    g_critical ("Source ID %u was not found when attempting to remove it", tag);
 
   return source != NULL;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]