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

Jonathon Jongsma jjongsma at redhat.com
Fri Sep 16 15:56:06 UTC 2016


On Fri, 2016-09-16 at 10:05 +0100, Frediano Ziglio wrote:
> 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_CLI
> ENT_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_C
> HANNEL_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                (DisplayChann
> elClient *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,

Acked-by: Jonathon Jongsma <jjongsma at redhat.com>


More information about the Spice-devel mailing list