From: Sebastian Dröge Date: Mon, 8 Feb 2010 07:12:11 +0000 (+0100) Subject: [MOVED FROM BAD 22/29] shapewipe: Fix race condition during shutdown that can lead... X-Git-Tag: 1.19.3~509^2~9162 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=11a16e95e23c9286180ffc42e17a89d2a4cae2f4;p=platform%2Fupstream%2Fgstreamer.git [MOVED FROM BAD 22/29] shapewipe: Fix race condition during shutdown that can lead to a deadlock --- diff --git a/gst/shapewipe/gstshapewipe.c b/gst/shapewipe/gstshapewipe.c index 7c512df..b8e4040 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 251a045..36b4fc5 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;