gobject: Handle ref_count==0 in notify_by_pspec
authorNick Schermer <nick@xfce.org>
Wed, 7 Aug 2013 19:01:00 +0000 (21:01 +0200)
committerColin Walters <walters@verbum.org>
Wed, 14 Aug 2013 17:11:05 +0000 (18:11 +0100)
Just like g_object_notify, check for a zero ref_count in
g_object_notify_by_pspec and leave if it is 0.

This allows using functions in ->finalize() that possibly also
notify a property change on the object.  Previously,
this resulted in an error from g_object_ref.

https://bugzilla.gnome.org/show_bug.cgi?id=705570

gobject/gobject.c
gobject/tests/properties.c

index d843d57..96a9d4f 100644 (file)
@@ -1238,6 +1238,9 @@ g_object_notify_by_pspec (GObject    *object,
   g_return_if_fail (G_IS_OBJECT (object));
   g_return_if_fail (G_IS_PARAM_SPEC (pspec));
 
+  if (g_atomic_int_get (&object->ref_count) == 0)
+    return;
+
   g_object_ref (object);
   g_object_notify_by_spec_internal (object, pspec);
   g_object_unref (object);
index 27c2a22..7140f90 100644 (file)
@@ -67,6 +67,13 @@ test_object_finalize (GObject *gobject)
 {
   g_free (((TestObject *) gobject)->baz);
 
+  /* When the ref_count of an object is zero it is still
+   * possible to notify the property, but it should do
+   * nothing and silenty quit (bug #705570)
+   */
+  g_object_notify (gobject, "foo");
+  g_object_notify_by_pspec (gobject, properties[PROP_BAR]);
+
   G_OBJECT_CLASS (test_object_parent_class)->finalize (gobject);
 }