diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2010-02-08 08:12:11 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2010-02-12 11:12:34 +0100 |
commit | 11a16e95e23c9286180ffc42e17a89d2a4cae2f4 (patch) | |
tree | e807e5e4480acba0714bfb3483ef141a59979a22 /gst/shapewipe | |
parent | 69b9c76dc85062db9f6faa2e78eb39097d1a08e2 (diff) | |
download | gstreamer-plugins-good-11a16e95e23c9286180ffc42e17a89d2a4cae2f4.tar.gz |
[MOVED FROM BAD 22/29] shapewipe: Fix race condition during shutdown that can lead to a deadlock
Diffstat (limited to 'gst/shapewipe')
-rw-r--r-- | gst/shapewipe/gstshapewipe.c | 20 | ||||
-rw-r--r-- | gst/shapewipe/gstshapewipe.h | 2 |
2 files changed, 17 insertions, 5 deletions
diff --git a/gst/shapewipe/gstshapewipe.c b/gst/shapewipe/gstshapewipe.c index 7c512df4e..b8e40404a 100644 --- a/gst/shapewipe/gstshapewipe.c +++ b/gst/shapewipe/gstshapewipe.c @@ -917,13 +917,18 @@ gst_shape_wipe_video_sink_chain (GstPad * pad, GstBuffer * buffer) GST_TIME_ARGS (timestamp), self->mask_position); g_mutex_lock (self->mask_mutex); + if (self->shutdown) { + gst_buffer_unref (buffer); + return GST_FLOW_WRONG_STATE; + } + if (!self->mask) g_cond_wait (self->mask_cond, self->mask_mutex); if (self->mask == NULL) { g_mutex_unlock (self->mask_mutex); gst_buffer_unref (buffer); - return GST_FLOW_UNEXPECTED; + return GST_FLOW_WRONG_STATE; } else { mask = gst_buffer_ref (self->mask); } @@ -1007,14 +1012,19 @@ gst_shape_wipe_change_state (GstElement * element, GstStateChange transition) switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: + self->shutdown = FALSE; + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + /* Unblock video sink chain function */ + g_mutex_lock (self->mask_mutex); + self->shutdown = TRUE; + g_cond_signal (self->mask_cond); + g_mutex_unlock (self->mask_mutex); + break; default: break; } - /* Unblock video sink chain function */ - if (transition == GST_STATE_CHANGE_PAUSED_TO_READY) - g_cond_signal (self->mask_cond); - if (GST_ELEMENT_CLASS (parent_class)->change_state) ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); diff --git a/gst/shapewipe/gstshapewipe.h b/gst/shapewipe/gstshapewipe.h index 251a0452c..36b4fc552 100644 --- a/gst/shapewipe/gstshapewipe.h +++ b/gst/shapewipe/gstshapewipe.h @@ -62,6 +62,8 @@ struct _GstShapeWipe GstVideoFormat fmt; gint width, height; + gboolean shutdown; + gdouble proportion; GstClockTime earliest_time; GstClockTime frame_duration; |