[Spice-commits] server/dcc-send.cpp

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Aug 31 08:50:18 UTC 2020

 server/dcc-send.cpp |    9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

New commits:
commit 2899fd91fb17d94c21488c295c15972fa10cac56
Author: Frediano Ziglio <freddy77 at gmail.com>
Date:   Fri Jul 17 16:46:54 2020 +0100

    dcc-send: Fix a regression adding an image item to the pipe
    The regression was introduced by
        commit 22fc6a48e65b75fbd1dc90c63bdb0df54c6b72e1
        red-channel-client: Change GQueue into a std::list
        Starts using smart pointers in the queue.
    dcc_add_surface_area_image added a new pipe item in front if pos was
    NULL. Before the commit red_add_lossless_drawable_dependencies passed
    a pointer to the last element in the pipe adding the new item on the
    back. The change caused the item to be inserted in front instead of
    back. Restore the insert position.
    This caused in some condition the pipe to grow uncontrollably (like
    using a large notepad window on Windows 7 and moving it around).
    Signed-off-by: Frediano Ziglio <freddy77 at gmail.com>

diff --git a/server/dcc-send.cpp b/server/dcc-send.cpp
index 687fd70f..a498c27c 100644
--- a/server/dcc-send.cpp
+++ b/server/dcc-send.cpp
@@ -172,6 +172,11 @@ static bool is_brush_lossy(DisplayChannelClient *dcc, SpiceBrush *brush,
+static RedChannelClient::Pipe::iterator get_pipe_tail(RedChannelClient::Pipe& pipe)
+    return pipe.empty() ? pipe.end() : --pipe.end();
 static void red_display_add_image_to_pixmap_cache(DisplayChannelClient *dcc,
                                                   SpiceImage *image, SpiceImage *io_image,
                                                   int is_lossy)
@@ -776,7 +781,7 @@ static void red_add_lossless_drawable_dependencies(DisplayChannelClient *dcc,
         // will be executed before the current drawable
         for (i = 0; i < num_deps; i++) {
             dcc_add_surface_area_image(dcc, deps_surfaces_ids[i], deps_areas[i],
-                                       dcc->get_pipe().end(), FALSE);
+                                       get_pipe_tail(dcc->get_pipe()), FALSE);
     } else {
@@ -797,7 +802,7 @@ static void red_add_lossless_drawable_dependencies(DisplayChannelClient *dcc,
         dcc_add_surface_area_image(dcc, drawable->surface_id, &drawable->bbox,
-                                   dcc->get_pipe().end(), TRUE);
+                                   get_pipe_tail(dcc->get_pipe()), TRUE);

More information about the Spice-commits mailing list