From: Sebastian Dröge Date: Thu, 22 Jul 2010 07:13:00 +0000 (+0200) Subject: streamsynchronizer: Fix another deadlock when going PAUSED->READY while streams are... X-Git-Tag: 1.19.3~511^2~8225 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ec3c19189d0a924ed9c27f347b0a79ce88c7c1fc;p=platform%2Fupstream%2Fgstreamer.git streamsynchronizer: Fix another deadlock when going PAUSED->READY while streams are waiting for the GCond --- diff --git a/gst/playback/gststreamsynchronizer.c b/gst/playback/gststreamsynchronizer.c index 1081eac..d4b8abe 100644 --- a/gst/playback/gststreamsynchronizer.c +++ b/gst/playback/gststreamsynchronizer.c @@ -350,6 +350,12 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstEvent * event) } } + if (self->shutdown) { + GST_STREAM_SYNCHRONIZER_UNLOCK (self); + gst_event_unref (event); + goto done; + } + if (stream && format == GST_FORMAT_TIME) { if (stream->new_stream) { gint64 last_stop_running_time = 0; @@ -451,6 +457,7 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstEvent * event) gst_object_unref (opad); } +done: gst_object_unref (self); return ret; @@ -687,14 +694,23 @@ gst_stream_synchronizer_change_state (GstElement * element, switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: GST_DEBUG_OBJECT (self, "State change NULL->READY"); + self->shutdown = FALSE; break; case GST_STATE_CHANGE_READY_TO_PAUSED: GST_DEBUG_OBJECT (self, "State change READY->PAUSED"); self->group_start_time = 0; + self->shutdown = FALSE; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: GST_DEBUG_OBJECT (self, "State change PAUSED->PLAYING"); break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + GST_DEBUG_OBJECT (self, "State change READY->NULL"); + + GST_STREAM_SYNCHRONIZER_LOCK (self); + g_cond_broadcast (self->stream_finish_cond); + self->shutdown = TRUE; + GST_STREAM_SYNCHRONIZER_UNLOCK (self); default: break; } @@ -734,7 +750,6 @@ gst_stream_synchronizer_change_state (GstElement * element, GST_DEBUG_OBJECT (self, "State change READY->NULL"); GST_STREAM_SYNCHRONIZER_LOCK (self); - g_cond_broadcast (self->stream_finish_cond); while (self->streams) gst_stream_synchronizer_release_stream (self, self->streams->data); self->current_stream_number = 0; diff --git a/gst/playback/gststreamsynchronizer.h b/gst/playback/gststreamsynchronizer.h index e4234e4..e2379ae 100644 --- a/gst/playback/gststreamsynchronizer.h +++ b/gst/playback/gststreamsynchronizer.h @@ -47,6 +47,7 @@ struct _GstStreamSynchronizer /* < private > */ GMutex *lock; GCond *stream_finish_cond; + gboolean shutdown; GList *streams; guint current_stream_number;