summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Withnall <pwithnall@endlessos.org>2021-09-14 14:04:23 +0100
committerPhilip Withnall <pwithnall@endlessos.org>2021-09-15 15:02:47 +0100
commit0d57092a036a527ac381f07b919e431a2b51b14f (patch)
treed80066cd7e629d5ad34c037ee06e39c603ae47f0
parentf763f2b7cb65499b4fd8a6a4922ce375ef078ca3 (diff)
downloadglib-0d57092a036a527ac381f07b919e431a2b51b14f.tar.gz
gobject: Document it’s unsafe to call g_object_ref() from GWeakNotify
The documentation sort of already said this, but it’s better to make it explicit. This avoids the situation where some of the weak notify callbacks for an object have been called, and then a subsequent one resurrects the object. Without some way of undoing the weak notifications already sent, that would leave external state which is coupled to the object’s lifecycle out of sync. This arose from discussion on !2064. Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
-rw-r--r--gobject/gobject.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/gobject/gobject.h b/gobject/gobject.h
index f62f9c902..d74bebc7c 100644
--- a/gobject/gobject.h
+++ b/gobject/gobject.h
@@ -238,6 +238,11 @@ typedef void (*GObjectFinalizeFunc) (GObject *object);
* Since the object is already being disposed when the #GWeakNotify is called,
* there's not much you could do with the object, apart from e.g. using its
* address as hash-index or the like.
+ *
+ * In particular, this means it’s invalid to call g_object_ref(),
+ * g_weak_ref_init(), g_weak_ref_set(), g_object_add_toggle_ref(),
+ * g_object_weak_ref(), g_object_add_weak_pointer() or any function which calls
+ * them on the object from this callback.
*/
typedef void (*GWeakNotify) (gpointer data,
GObject *where_the_object_was);