playsink: Always take the playsink lock when adding or removing pad probes
authorSebastian Dröge <sebastian@centricular.com>
Tue, 20 May 2014 07:48:56 +0000 (09:48 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 20 May 2014 07:51:07 +0000 (09:51 +0200)
Otherwise we might end up inside the callback without having stored
the probe id... then try to remove that probe (not!) from the callback
and wait forever for the pad to unblock.

gst/playback/gstplaysink.c

index c032a58..006b83c 100644 (file)
@@ -4388,6 +4388,8 @@ gst_play_sink_request_pad (GstPlaySink * playsink, GstPlaySinkType type)
      * element is 'running' */
     gst_pad_set_active (res, TRUE);
     gst_element_add_pad (GST_ELEMENT_CAST (playsink), res);
+
+    GST_PLAY_SINK_LOCK (playsink);
     if (block_id && *block_id == 0) {
       GstPad *blockpad =
           GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD (res)));
@@ -4403,6 +4405,7 @@ gst_play_sink_request_pad (GstPlaySink * playsink, GstPlaySinkType type)
       PENDING_FLAG_SET (playsink, type);
       gst_object_unref (blockpad);
     }
+    GST_PLAY_SINK_UNLOCK (playsink);
     if (!activate)
       gst_pad_set_active (res, activate);
   }