diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | gst/gstpad.c | 14 |
2 files changed, 20 insertions, 1 deletions
@@ -1,5 +1,12 @@ 2005-10-03 Andy Wingo <wingo@pobox.com> + * gst/gstpad.c (gst_pad_activate_push): There is a race condition + whereby calling a pad's activatepush() function can start a thread + that starts to push or pull before the pad gets the FLUSHING flag + unset. Hack around it by holding the stream lock until the flag is + set. Need to replace this with a proper solution. Together with + the ghost pad fixes, this fixes mp3 playing/tagreading. + * docs/design/part-gstghostpad.txt: Add a note about activation of proxy pads outside of ghost pads. diff --git a/gst/gstpad.c b/gst/gstpad.c index b7c5294714..e7b6b6d8b7 100644 --- a/gst/gstpad.c +++ b/gst/gstpad.c @@ -490,7 +490,7 @@ post_activate_switch (GstPad * pad, gboolean new_active) GST_PAD_UNSET_FLUSHING (pad); GST_UNLOCK (pad); } else { - /* make streaming stop */ + /* ensures that streaming stops */ GST_STREAM_LOCK (pad); GST_STREAM_UNLOCK (pad); } @@ -688,6 +688,10 @@ gst_pad_activate_push (GstPad * pad, gboolean active) pre_activate_switch (pad, active); + /* terrible hack */ + if (active) + GST_STREAM_LOCK (pad); + if (GST_PAD_ACTIVATEPUSHFUNC (pad)) { if (GST_PAD_ACTIVATEPUSHFUNC (pad) (pad, active)) { goto success; @@ -714,6 +718,10 @@ success: GST_UNLOCK (pad); post_activate_switch (pad, active); + /* terrible hack */ + if (active) + GST_STREAM_UNLOCK (pad); + GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "%s in push mode", active ? "activated" : "deactivated"); return TRUE; @@ -721,6 +729,10 @@ success: failure: { + /* terrible hack */ + if (active) + GST_STREAM_UNLOCK (pad); + GST_CAT_INFO_OBJECT (GST_CAT_PADS, pad, "failed to %s in push mode", active ? "activate" : "deactivate"); return FALSE; |