summaryrefslogtreecommitdiff
path: root/recipes/glib-2.0/bug-556515.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/glib-2.0/bug-556515.patch')
-rw-r--r--recipes/glib-2.0/bug-556515.patch35
1 files changed, 35 insertions, 0 deletions
diff --git a/recipes/glib-2.0/bug-556515.patch b/recipes/glib-2.0/bug-556515.patch
new file mode 100644
index 0000000000..0af15a6f8f
--- /dev/null
+++ b/recipes/glib-2.0/bug-556515.patch
@@ -0,0 +1,35 @@
+https://bugzilla.gnome.org/show_bug.cgi?id=556515 - g_object_unref race condition
+
+
+diff --git /tmp/gobject.c glib-2.21.6/gobject/gobject.c
+index 454d8c2..75f479c 100644
+--- /tmp/gobject.c
++++ glib-2.21.6/gobject/gobject.c
+@@ -2380,11 +2380,12 @@ g_object_unref (gpointer _object)
+ old_ref = g_atomic_int_get (&object->ref_count);
+ if (old_ref > 1)
+ {
++ gboolean do_toggle_ref_notify = (old_ref == 2 && OBJECT_HAS_TOGGLE_REF (object));
+ if (!g_atomic_int_compare_and_exchange ((int *)&object->ref_count, old_ref, old_ref - 1))
+ goto retry_atomic_decrement1;
+
+ /* if we went from 2->1 we need to notify toggle refs if any */
+- if (old_ref == 2 && OBJECT_HAS_TOGGLE_REF (object))
++ if (do_toggle_ref_notify)
+ toggle_refs_notify (object, TRUE);
+ }
+ else
+@@ -2397,11 +2398,12 @@ g_object_unref (gpointer _object)
+ old_ref = g_atomic_int_get ((int *)&object->ref_count);
+ if (old_ref > 1)
+ {
++ gboolean do_toggle_ref_notify = (old_ref == 2 && OBJECT_HAS_TOGGLE_REF (object));
+ if (!g_atomic_int_compare_and_exchange ((int *)&object->ref_count, old_ref, old_ref - 1))
+ goto retry_atomic_decrement2;
+
+ /* if we went from 2->1 we need to notify toggle refs if any */
+- if (old_ref == 2 && OBJECT_HAS_TOGGLE_REF (object))
++ if (do_toggle_ref_notify)
+ toggle_refs_notify (object, TRUE);
+
+ return;