summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--gst/gstpad.c14
2 files changed, 20 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 337f3d0e5d..cb470c8d37 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;