bus: Unreferencing messages outside the lock

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
This commit is contained in:
Vivia Nikolaidou 2015-03-13 15:28:42 +02:00 committed by Sebastian Dröge
parent 6ec3c4bc66
commit 721539dc4f

View file

@ -446,6 +446,7 @@ void
gst_bus_set_flushing (GstBus * bus, gboolean flushing) gst_bus_set_flushing (GstBus * bus, gboolean flushing)
{ {
GstMessage *message; GstMessage *message;
GList *l, *message_list = NULL;
GST_OBJECT_LOCK (bus); GST_OBJECT_LOCK (bus);
@ -455,13 +456,19 @@ gst_bus_set_flushing (GstBus * bus, gboolean flushing)
GST_DEBUG_OBJECT (bus, "set bus flushing"); GST_DEBUG_OBJECT (bus, "set bus flushing");
while ((message = gst_bus_pop (bus))) while ((message = gst_bus_pop (bus)))
gst_message_unref (message); message_list = g_list_prepend (message_list, message);
} else { } else {
GST_DEBUG_OBJECT (bus, "unset bus flushing"); GST_DEBUG_OBJECT (bus, "unset bus flushing");
GST_OBJECT_FLAG_UNSET (bus, GST_BUS_FLUSHING); GST_OBJECT_FLAG_UNSET (bus, GST_BUS_FLUSHING);
} }
GST_OBJECT_UNLOCK (bus); 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);
} }
/** /**