[glib/th/gdbus-doc-unsubscribe-idle: 2/2] main: document notify function gets called during g_source_destroy()




commit affe10e63df096def9458d17b90495db9bcc50e5
Author: Thomas Haller <thaller redhat com>
Date:   Sun Apr 18 21:01:19 2021 +0200

    main: document notify function gets called during g_source_destroy()
    
    This seems non-obvious to me. Document it.
    
    It also seems important to know, because it means that the data pointer
    might already be destroyed, before the source is unreferenced for good.
    For example, if the data pointer keeps a reference to the GSource,
    and it might seem sensible to call:
    
        g_source_destroy(data->source);
        g_source_unref(data->source); /* <<< data is already destroyed? */
    
    This leads to a crash, if the source was attached to a context.

 glib/gmain.c | 9 +++++++++
 1 file changed, 9 insertions(+)
---
diff --git a/glib/gmain.c b/glib/gmain.c
index 2e1ab3a25..695dcdd7c 100644
--- a/glib/gmain.c
+++ b/glib/gmain.c
@@ -1370,6 +1370,10 @@ g_source_destroy_internal (GSource      *source,
  *
  * This function is safe to call from any thread, regardless of which thread
  * the #GMainContext is running in.
+ *
+ * If the source is currently attached to a #GMainContext, removing it
+ * will unset the callback and call the #GDestroyNotify right away. In this
+ * case it is like calling g_source_set_callback() to unset the callback.
  */
 void
 g_source_destroy (GSource *source)
@@ -1761,6 +1765,11 @@ g_source_set_callback_indirect (GSource              *source,
  * It is safe to call this function multiple times on a source which has already
  * been attached to a context. The changes will take effect for the next time
  * the source is dispatched after this call returns.
+ *
+ * The @notify function gets invoked during g_source_destroy() if the source
+ * was attached, or during the last g_source_unref() otherwise.
+ * Calling g_source_set_callback() will also invoke the @notify function of
+ * the previous callback, if any.
  **/
 void
 g_source_set_callback (GSource        *source,


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