bus: Unreferencing messages outside the lock
authorVivia Nikolaidou <vivia@ahiru.eu>
Fri, 13 Mar 2015 13:28:42 +0000 (15:28 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Fri, 13 Mar 2015 13:37:49 +0000 (13:37 +0000)
Shouldn't take the lock while unreferencing messages, because that may cause
more messages to be sent, which will try to take the lock and cause the app to
hang.

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

gst/gstbus.c

index 13b0546..9953210 100644 (file)
@@ -446,6 +446,7 @@ void
 gst_bus_set_flushing (GstBus * bus, gboolean flushing)
 {
   GstMessage *message;
+  GList *l, *message_list = NULL;
 
   GST_OBJECT_LOCK (bus);
 
@@ -455,13 +456,19 @@ gst_bus_set_flushing (GstBus * bus, gboolean flushing)
     GST_DEBUG_OBJECT (bus, "set bus flushing");
 
     while ((message = gst_bus_pop (bus)))
-      gst_message_unref (message);
+      message_list = g_list_prepend (message_list, message);
   } else {
     GST_DEBUG_OBJECT (bus, "unset bus flushing");
     GST_OBJECT_FLAG_UNSET (bus, GST_BUS_FLUSHING);
   }
 
   GST_OBJECT_UNLOCK (bus);
+
+  for (l = message_list; l; l = l->next) {
+    message = GST_MESSAGE (l);
+    gst_message_unref (message);
+  }
+  g_list_free (message_list);
 }
 
 /**