From: Sebastian Dröge Date: Thu, 20 Oct 2011 13:21:07 +0000 (+0200) Subject: omxvideodec: Fix deadlock caused by calling reset while the loop function does someth... X-Git-Tag: 1.19.3~501^2~893 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=10a56806921c36ffc6203306123bdd4d75edf142;p=platform%2Fupstream%2Fgstreamer.git omxvideodec: Fix deadlock caused by calling reset while the loop function does something with the base video codec stream lock --- diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c index edf239d..b236407 100644 --- a/omx/gstomxvideodec.c +++ b/omx/gstomxvideodec.c @@ -1093,21 +1093,25 @@ gst_omx_video_dec_reset (GstBaseVideoDecoder * decoder) /* FIXME: Workaround for * https://bugzilla.gnome.org/show_bug.cgi?id=654529 + * + * This is always called with GST_BASE_VIDEO_CODEC_STREAM_LOCK */ - GST_BASE_VIDEO_CODEC_STREAM_LOCK (self); g_list_foreach (GST_BASE_VIDEO_CODEC (self)->frames, (GFunc) gst_base_video_codec_free_frame, NULL); g_list_free (GST_BASE_VIDEO_CODEC (self)->frames); GST_BASE_VIDEO_CODEC (self)->frames = NULL; - GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (self); if (self->started) { gst_omx_port_set_flushing (self->in_port, TRUE); gst_omx_port_set_flushing (self->out_port, TRUE); - /* Wait until the srcpad loop is finished */ + /* Wait until the srcpad loop is finished, + * unlock GST_BASE_VIDEO_CODEC_STREAM_LOCK to prevent deadlocks + * caused by using this lock from inside the loop function */ + GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (self); GST_PAD_STREAM_LOCK (GST_BASE_VIDEO_CODEC_SRC_PAD (self)); GST_PAD_STREAM_UNLOCK (GST_BASE_VIDEO_CODEC_SRC_PAD (self)); + GST_BASE_VIDEO_CODEC_STREAM_LOCK (self); gst_omx_port_set_flushing (self->in_port, FALSE); gst_omx_port_set_flushing (self->out_port, FALSE);