queue: Do not hold GST_QUEUE_LOCK while posting ERROR messages
authorThibault Saunier <tsaunier@gnome.org>
Mon, 22 Sep 2014 07:33:04 +0000 (09:33 +0200)
committerThibault Saunier <tsaunier@gnome.org>
Mon, 22 Sep 2014 14:13:44 +0000 (16:13 +0200)
This might create deadlocks and we need to avoid holding element
specific lock while posting messages

For example a deadlock will happen if while posting the message,
someone connected on the bus (sync) tries to DOT the pipeline.

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

plugins/elements/gstqueue.c

index 29c4e9e..d7d9685 100644 (file)
@@ -827,10 +827,12 @@ gst_queue_handle_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
            * return FALSE here though and report an error.
            */
           if (!GST_EVENT_IS_STICKY (event)) {
+            GST_QUEUE_MUTEX_UNLOCK (queue);
             goto out_flow_error;
           } else if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
             if (queue->srcresult == GST_FLOW_NOT_LINKED
                 || queue->srcresult < GST_FLOW_EOS) {
+              GST_QUEUE_MUTEX_UNLOCK (queue);
               GST_ELEMENT_ERROR (queue, STREAM, FAILED,
                   (_("Internal data flow error.")),
                   ("streaming task paused, reason %s (%d)",
@@ -865,7 +867,6 @@ out_flow_error:
     GST_CAT_LOG_OBJECT (queue_dataflow, queue,
         "refusing event, we have a downstream flow error: %s",
         gst_flow_get_name (queue->srcresult));
-    GST_QUEUE_MUTEX_UNLOCK (queue);
     gst_event_unref (event);
     return FALSE;
   }