[glib: 7/8] gdbusconnection: Document threading and refcounting for signals
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib: 7/8] gdbusconnection: Document threading and refcounting for signals
- Date: Tue, 21 Jan 2020 10:44:37 +0000 (UTC)
commit 37b1acdf8cecf5c06fe57b506e9a0a15191a9479
Author: Philip Withnall <withnall endlessm com>
Date: Mon Jan 20 11:37:48 2020 +0000
gdbusconnection: Document threading and refcounting for signals
This is essentially a mini writeup of #978.
Signed-off-by: Philip Withnall <withnall endlessm com>
Helps: #978
gio/gdbusconnection.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
---
diff --git a/gio/gdbusconnection.c b/gio/gdbusconnection.c
index 3b7a2ad6f..67496be5b 100644
--- a/gio/gdbusconnection.c
+++ b/gio/gdbusconnection.c
@@ -3468,6 +3468,24 @@ is_signal_data_for_name_lost_or_acquired (SignalData *signal_data)
* signal is unsubscribed from, and may be called after @connection
* has been destroyed.)
*
+ * As @callback is potentially invoked in a different thread from where it’s
+ * emitted, it’s possible for this to happen after
+ * g_dbus_connection_signal_unsubscribe() has been called in another thread.
+ * Due to this, @user_data should have a strong reference which is freed with
+ * @user_data_free_func, rather than pointing to data whose lifecycle is tied
+ * to the signal subscription. For example, if a #GObject is used to store the
+ * subscription ID from g_dbus_connection_signal_subscribe(), a strong reference
+ * to that #GObject must be passed to @user_data, and g_object_unref() passed to
+ * @user_data_free_func. You are responsible for breaking the resulting
+ * reference count cycle by explicitly unsubscribing from the signal when
+ * dropping the last external reference to the #GObject. Alternatively, a weak
+ * reference may be used.
+ *
+ * It is guaranteed that if you unsubscribe from a signal using
+ * g_dbus_connection_signal_unsubscribe() from the same thread which made the
+ * corresponding g_dbus_connection_signal_subscribe() call, @callback will not
+ * be invoked after g_dbus_connection_signal_unsubscribe() returns.
+ *
* The returned subscription identifier is an opaque value which is guaranteed
* to never be zero.
*
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]