[Spice-devel] [PATCH] fixup! RedChannelClient: store pipe items in a GQueue

Frediano Ziglio fziglio at redhat.com
Fri Sep 16 09:05:29 UTC 2016


Minor changes:
- use same name for dcc_add_surface_area_image argument in header
  and source;
- avoid using 2 variable in a for loop, is not much readable and
  confusing. This also was fixing a regression quite hard to spot
  so make sure code is less easy to break in the future;
- remove check in red_drawable_pipe_item_free. Now RedDrawablePipeItem
  is not forced to know in which container is it and the check should
  be up to container. Also this was potentially O(n) expensive with
  the GQueue implementation.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 server/dcc.c | 31 +++++++++++--------------------
 server/dcc.h |  2 +-
 2 files changed, 12 insertions(+), 21 deletions(-)

diff --git a/server/dcc.c b/server/dcc.c
index 184a944..cca3ce5 100644
--- a/server/dcc.c
+++ b/server/dcc.c
@@ -68,7 +68,7 @@ int dcc_drawable_is_in_pipe(DisplayChannelClient *dcc, Drawable *drawable)
 int dcc_clear_surface_drawables_from_pipe(DisplayChannelClient *dcc, int surface_id,
                                           int wait_if_used)
 {
-    GList *l, *item_pos = NULL;
+    GList *l;
     int x;
     RedChannelClient *rcc;
 
@@ -77,13 +77,13 @@ int dcc_clear_surface_drawables_from_pipe(DisplayChannelClient *dcc, int surface
        no other drawable depends on them */
 
     rcc = RED_CHANNEL_CLIENT(dcc);
-    for (l = rcc->priv->pipe.head; l != NULL; item_pos = NULL) {
+    for (l = rcc->priv->pipe.head; l != NULL; ) {
         Drawable *drawable;
         RedDrawablePipeItem *dpi = NULL;
         int depend_found = FALSE;
         RedPipeItem *item = l->data;
+        GList *item_pos = l;
 
-        item_pos = l;
         l = l->next;
         if (item->type == RED_PIPE_ITEM_TYPE_DRAW) {
             dpi = SPICE_CONTAINEROF(item, RedDrawablePipeItem, dpi_pipe_item);
@@ -108,11 +108,11 @@ int dcc_clear_surface_drawables_from_pipe(DisplayChannelClient *dcc, int surface
 
         if (depend_found) {
             spice_debug("surface %d dependent item found %p, %p", surface_id, drawable, item);
-            if (wait_if_used) {
-                break;
-            } else {
+            if (!wait_if_used) {
                 return TRUE;
             }
+            return red_channel_client_wait_pipe_item_sent(rcc, item_pos,
+                                                          COMMON_CLIENT_TIMEOUT);
         }
     }
 
@@ -120,18 +120,11 @@ int dcc_clear_surface_drawables_from_pipe(DisplayChannelClient *dcc, int surface
         return TRUE;
     }
 
-    if (item_pos) {
-        return red_channel_client_wait_pipe_item_sent(RED_CHANNEL_CLIENT(dcc), item_pos,
-                                                      COMMON_CLIENT_TIMEOUT);
-    } else {
-        /*
-         * in case that the pipe didn't contain any item that is dependent on the surface, but
-         * there is one during sending. Use a shorter timeout, since it is just one item
-         */
-        return red_channel_client_wait_outgoing_item(RED_CHANNEL_CLIENT(dcc),
-                                                     DISPLAY_CLIENT_SHORT_TIMEOUT);
-    }
-    return TRUE;
+    /*
+     * in case that the pipe didn't contain any item that is dependent on the surface, but
+     * there is one during sending. Use a shorter timeout, since it is just one item
+     */
+    return red_channel_client_wait_outgoing_item(rcc, DISPLAY_CLIENT_SHORT_TIMEOUT);
 }
 
 void dcc_create_surface(DisplayChannelClient *dcc, int surface_id)
@@ -284,8 +277,6 @@ static void red_drawable_pipe_item_free(RedPipeItem *item)
                                                  dpi_pipe_item);
     spice_assert(item->refcount == 0);
 
-    spice_warn_if_fail(!red_channel_client_pipe_item_is_linked(RED_CHANNEL_CLIENT(dpi->dcc),
-                                                               &dpi->dpi_pipe_item));
     if (ring_item_is_linked(&dpi->base)) {
         ring_remove(&dpi->base);
     }
diff --git a/server/dcc.h b/server/dcc.h
index 7f93186..a2478b9 100644
--- a/server/dcc.h
+++ b/server/dcc.h
@@ -129,7 +129,7 @@ void                       dcc_push_surface_image                    (DisplayCha
 RedImageItem *             dcc_add_surface_area_image                (DisplayChannelClient *dcc,
                                                                       int surface_id,
                                                                       SpiceRect *area,
-                                                                      GList *pos,
+                                                                      GList *pipe_item_pos,
                                                                       int can_lossy);
 void                       dcc_palette_cache_reset                   (DisplayChannelClient *dcc);
 void                       dcc_palette_cache_palette                 (DisplayChannelClient *dcc,
-- 
2.7.4



More information about the Spice-devel mailing list