[gst-cvs] gstreamer: queue2: flush differently, avoiding deadlocks

Sebastian Dröge slomo at kemper.freedesktop.org
Thu Oct 29 03:41:59 PDT 2009


Module: gstreamer
Branch: master
Commit: 49c01cce9371722090cc30a22de513a6561a6cae
URL:    http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=49c01cce9371722090cc30a22de513a6561a6cae

Author: Wim Taymans <wim.taymans at collabora.co.uk>
Date:   Fri Jul 10 21:01:39 2009 +0100

queue2: flush differently, avoiding deadlocks

Don't flush the file by closing and opening it but instead use g_freopen. This
avoids a deadlock in shutdown because we emit the temp-location property change
with the wrong lock held.

---

 gst/playback/gstqueue2.c |   17 +++++++++++++++--
 1 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/gst/playback/gstqueue2.c b/gst/playback/gstqueue2.c
index 538f809..47a0a84 100644
--- a/gst/playback/gstqueue2.c
+++ b/gst/playback/gstqueue2.c
@@ -1089,11 +1089,24 @@ gst_queue_close_temp_location_file (GstQueue * queue)
 }
 
 static void
+gst_queue_flush_temp_file (GstQueue * queue)
+{
+  if (queue->temp_file == NULL)
+    return;
+
+  GST_DEBUG_OBJECT (queue, "flushing temp file");
+
+  queue->temp_file = g_freopen (queue->temp_location, "wb+", queue->temp_file);
+
+  queue->writing_pos = 0;
+  queue->reading_pos = 0;
+}
+
+static void
 gst_queue_locked_flush (GstQueue * queue)
 {
   if (QUEUE_IS_USING_TEMP_FILE (queue)) {
-    gst_queue_close_temp_location_file (queue);
-    gst_queue_open_temp_location_file (queue);
+    gst_queue_flush_temp_file (queue);
   } else {
     while (!g_queue_is_empty (queue->queue)) {
       GstMiniObject *data = g_queue_pop_head (queue->queue);





More information about the Gstreamer-commits mailing list