From: Christophe de Dinechin <dinec...@redhat.com>

Experience has shown that if the machine running the guest is overloaded,
it may pile up a lot of backlog in the frames queue. This patch clears
the queue if it exceeds 100 entries. This value is arbitrary. It
corresponds to a few seconds on a highly overloaded machine.

Signed-off-by: Christophe de Dinechin <dinec...@redhat.com>
---
 src/channel-display-gst.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c
index 3cf451b..17c2847 100644
--- a/src/channel-display-gst.c
+++ b/src/channel-display-gst.c
@@ -498,6 +498,9 @@ static void spice_gst_decoder_destroy(VideoDecoder 
*video_decoder)
  * 9) display_frame() then frees the SpiceGstFrame, which frees the SpiceFrame
  *    and decompressed frame with it.
  */
+
+SPICE_TWEAK_DEFINE(gst_queue_max_length, 100, "Max length of GStreamer queue");
+
 static gboolean spice_gst_decoder_queue_frame(VideoDecoder *video_decoder,
                                               SpiceFrame *frame, int latency)
 {
@@ -541,6 +544,16 @@ static gboolean spice_gst_decoder_queue_frame(VideoDecoder 
*video_decoder,
     }
 #endif
 
+    if (SPICE_TWEAK(gst_queue_max_length) &&
+        decoder->decoding_queue->length > SPICE_TWEAK(gst_queue_max_length)) {
+       SpiceGstFrame *gstframe;
+       g_mutex_lock(&decoder->queues_mutex);
+        while ((gstframe = g_queue_pop_head(decoder->decoding_queue)))
+            free_gst_frame(gstframe);
+        g_mutex_unlock(&decoder->queues_mutex);
+        return TRUE;
+    }
+
     /* ref() the frame data for the buffer */
     frame->ref_data(frame->data_opaque);
     GstBuffer *buffer = 
gst_buffer_new_wrapped_full(GST_MEMORY_FLAG_PHYSICALLY_CONTIGUOUS,
-- 
2.11.0 (Apple Git-81)

_______________________________________________
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/spice-devel

Reply via email to