summaryrefslogtreecommitdiff
path: root/gobject
diff options
context:
space:
mode:
authorPhilip Withnall <philip@tecnocode.co.uk>2022-07-07 11:52:19 +0000
committerPhilip Withnall <philip@tecnocode.co.uk>2022-07-07 11:52:19 +0000
commited564b71dd46a39d1d821166f613b426cb98491c (patch)
tree72612f425c0cad47018aceb83506dd1681fc4f99 /gobject
parent1bf53c9ced65dcb7956abadf2ebcc398b809f709 (diff)
parent4ef2025d47770ea2da1c4cc9360f21a002d4ed62 (diff)
downloadglib-ed564b71dd46a39d1d821166f613b426cb98491c.tar.gz
Merge branch '2672-dataset-tests-and-fixes' into 'main'
gdataset: Preserve destruction order Closes #2672 and #2676 See merge request GNOME/glib!2776
Diffstat (limited to 'gobject')
-rw-r--r--gobject/gobject.c18
-rw-r--r--gobject/tests/binding.c48
2 files changed, 60 insertions, 6 deletions
diff --git a/gobject/gobject.c b/gobject/gobject.c
index ac887f387..5789e79a7 100644
--- a/gobject/gobject.c
+++ b/gobject/gobject.c
@@ -5049,16 +5049,22 @@ g_weak_ref_set (GWeakRef *weak_ref,
/* Remove the weak ref from the old object */
if (old_object != NULL)
{
+ gboolean in_weak_refs_notify;
+
weak_locations = g_datalist_id_get_data (&old_object->qdata, quark_weak_locations);
+ in_weak_refs_notify = g_datalist_id_get_data (&old_object->qdata, quark_weak_refs) == NULL;
/* for it to point to an object, the object must have had it added once */
- g_assert (weak_locations != NULL);
-
- *weak_locations = g_slist_remove (*weak_locations, weak_ref);
+ g_assert (weak_locations != NULL || in_weak_refs_notify);
- if (!*weak_locations)
+ if (weak_locations != NULL)
{
- weak_locations_free_unlocked (weak_locations);
- g_datalist_id_remove_no_notify (&old_object->qdata, quark_weak_locations);
+ *weak_locations = g_slist_remove (*weak_locations, weak_ref);
+
+ if (!*weak_locations)
+ {
+ weak_locations_free_unlocked (weak_locations);
+ g_datalist_id_remove_no_notify (&old_object->qdata, quark_weak_locations);
+ }
}
}
diff --git a/gobject/tests/binding.c b/gobject/tests/binding.c
index b8373e345..cc6e65987 100644
--- a/gobject/tests/binding.c
+++ b/gobject/tests/binding.c
@@ -1089,6 +1089,52 @@ binding_concurrent_finalizing (void)
}
}
+static void
+binding_dispose_source (void)
+{
+ /* Test that the source can be disposed */
+ BindingSource *source = g_object_new (binding_source_get_type (), NULL);
+ BindingTarget *target = g_object_new (binding_target_get_type (), NULL);
+ GBinding *binding;
+
+ g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2676");
+
+ binding = g_object_bind_property (source, "foo",
+ target, "bar",
+ G_BINDING_DEFAULT);
+
+ g_object_add_weak_pointer (G_OBJECT (binding), (gpointer *) &binding);
+
+ g_object_run_dispose (G_OBJECT (source));
+ g_assert_null (binding);
+
+ g_object_unref (target);
+ g_object_unref (source);
+}
+
+static void
+binding_dispose_target (void)
+{
+ /* Test that the target can be disposed */
+ BindingSource *source = g_object_new (binding_source_get_type (), NULL);
+ BindingTarget *target = g_object_new (binding_target_get_type (), NULL);
+ GBinding *binding;
+
+ g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2676");
+
+ binding = g_object_bind_property (source, "foo",
+ target, "bar",
+ G_BINDING_DEFAULT);
+
+ g_object_add_weak_pointer (G_OBJECT (binding), (gpointer *) &binding);
+
+ g_object_run_dispose (G_OBJECT (target));
+ g_assert_null (binding);
+
+ g_object_unref (target);
+ g_object_unref (source);
+}
+
int
main (int argc, char *argv[])
{
@@ -1111,6 +1157,8 @@ main (int argc, char *argv[])
g_test_add_func ("/binding/interface", binding_interface);
g_test_add_func ("/binding/concurrent-unbind", binding_concurrent_unbind);
g_test_add_func ("/binding/concurrent-finalizing", binding_concurrent_finalizing);
+ g_test_add_func ("/binding/dispose-source", binding_dispose_source);
+ g_test_add_func ("/binding/dispose-target", binding_dispose_target);
return g_test_run ();
}