hlsdemux: Fix another race condition by holding the mutex that the condition variable...
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Mon, 15 Oct 2012 08:32:47 +0000 (10:32 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Mon, 15 Oct 2012 08:38:36 +0000 (10:38 +0200)
Conflicts:
gst/hls/gsthlsdemux.c

gst/hls/gsthlsdemux.c

index 5f56651fde25ecf1949e20bd936fb16881fa2a9c..2ebf84b140163baf020b590b187a22d75f706305 100644 (file)
@@ -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);
   }