diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-10-15 10:32:47 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-10-15 10:38:36 +0200 |
commit | 443703a08ea1d0379c149f4dbfdbf97d80ca7a44 (patch) | |
tree | a9f6cf4905c77f6d5675b08c84aeb925bda4c89b /gst | |
parent | e3f00d625290bd0b06622f0b4ff8657c98299fe7 (diff) | |
download | gstreamer-plugins-bad-443703a08ea1d0379c149f4dbfdbf97d80ca7a44.tar.gz |
hlsdemux: Fix another race condition by holding the mutex that the condition variable uses
Conflicts:
gst/hls/gsthlsdemux.c
Diffstat (limited to 'gst')
-rw-r--r-- | gst/hls/gsthlsdemux.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/gst/hls/gsthlsdemux.c b/gst/hls/gsthlsdemux.c index 5f56651fd..2ebf84b14 100644 --- a/gst/hls/gsthlsdemux.c +++ b/gst/hls/gsthlsdemux.c @@ -140,9 +140,11 @@ gst_hls_demux_dispose (GObject * obj) if (GST_TASK_STATE (demux->updates_task) != GST_TASK_STOPPED) { GST_DEBUG_OBJECT (demux, "Leaving updates task"); gst_task_stop (demux->updates_task); + g_mutex_lock (&demux->updates_timed_lock); GST_TASK_SIGNAL (demux->updates_task); g_rec_mutex_lock (&demux->updates_lock); g_rec_mutex_unlock (&demux->updates_lock); + g_mutex_unlock (&demux->updates_timed_lock); gst_task_join (demux->updates_task); } gst_object_unref (demux->updates_task); @@ -322,7 +324,9 @@ gst_hls_demux_change_state (GstElement * element, GstStateChange transition) switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: gst_task_stop (demux->updates_task); + g_mutex_lock (&demux->updates_timed_lock); GST_TASK_SIGNAL (demux->updates_task); + g_mutex_unlock (&demux->updates_timed_lock); g_rec_mutex_lock (&demux->updates_lock); g_rec_mutex_unlock (&demux->updates_lock); break; @@ -406,7 +410,9 @@ gst_hls_demux_src_event (GstPad * pad, GstObject * parent, GstEvent * event) gst_task_pause (demux->stream_task); gst_uri_downloader_cancel (demux->downloader); gst_task_stop (demux->updates_task); + g_mutex_lock (&demux->updates_timed_lock); GST_TASK_SIGNAL (demux->updates_task); + g_mutex_unlock (&demux->updates_timed_lock); g_rec_mutex_lock (&demux->updates_lock); g_rec_mutex_unlock (&demux->updates_lock); gst_task_pause (demux->stream_task); @@ -603,7 +609,9 @@ gst_hls_demux_pause_tasks (GstHLSDemux * demux) if (GST_TASK_STATE (demux->updates_task) != GST_TASK_STOPPED) { demux->stop_stream_task = TRUE; gst_task_pause (demux->updates_task); + g_mutex_lock (&demux->updates_timed_lock); GST_TASK_SIGNAL (demux->updates_task); + g_mutex_unlock (&demux->updates_timed_lock); } if (GST_TASK_STATE (demux->stream_task) != GST_TASK_STOPPED) { @@ -619,7 +627,9 @@ gst_hls_demux_stop (GstHLSDemux * demux) if (GST_TASK_STATE (demux->updates_task) != GST_TASK_STOPPED) { demux->stop_stream_task = TRUE; gst_task_stop (demux->updates_task); + g_mutex_lock (&demux->updates_timed_lock); GST_TASK_SIGNAL (demux->updates_task); + g_mutex_unlock (&demux->updates_timed_lock); g_rec_mutex_lock (&demux->updates_lock); g_rec_mutex_unlock (&demux->updates_lock); } |