[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