[Spice-devel] [PATCH 09/18] worker: move dcc_release_item

Frediano Ziglio fziglio at redhat.com
Tue Nov 24 01:15:58 PST 2015


> 
> On Mon, 2015-11-23 at 17:01 +0000, Frediano Ziglio wrote:
> > From: Marc-André Lureau <marcandre.lureau at gmail.com>
> > 
> > ---
> >  server/dcc.c             | 124 ++++++++++++++++++++++++++++++++++++++++++
> >  server/dcc.h             |   3 ++
> >  server/display-channel.h |   7 +++
> >  server/red_worker.c      | 136
> >  +---------------------------------------------
> > -
> >  4 files changed, 136 insertions(+), 134 deletions(-)
> > 
> > diff --git a/server/dcc.c b/server/dcc.c
> > index 5be3769..5d666cb 100644
> > --- a/server/dcc.c
> > +++ b/server/dcc.c
> > @@ -1394,3 +1394,127 @@ int dcc_handle_migrate_data(DisplayChannelClient
> > *dcc,
> > uint32_t size, void *mess
> >      red_channel_client_ack_zero_messages_window(RED_CHANNEL_CLIENT(dcc));
> >      return TRUE;
> >  }
> > +
> > +static void image_item_unref(ImageItem *item)
> > +{
> > +    if (--item->refs != 0)
> > +        return;
> > +
> > +    free(item);
> > +}
> > +
> > +static void upgrade_item_unref(DisplayChannel *display, UpgradeItem *item)
> > +{
> > +    if (--item->refs != 0)
> > +        return;
> > +
> > +    display_channel_drawable_unref(display, item->drawable);
> > +    free(item->rects);
> > +    free(item);
> > +}
> > +
> > +static void release_item_after_push(DisplayChannelClient *dcc, PipeItem
> > *item)
> > +{
> > +    DisplayChannel *display = DCC_TO_DC(dcc);
> > +
> > +    switch (item->type) {
> > +    case PIPE_ITEM_TYPE_DRAW:
> > +        drawable_pipe_item_unref(SPICE_CONTAINEROF(item, DrawablePipeItem,
> > dpi_pipe_item));
> > +        break;
> > +    case PIPE_ITEM_TYPE_STREAM_CLIP:
> > +        stream_clip_item_unref(dcc, (StreamClipItem *)item);
> > +        break;
> > +    case PIPE_ITEM_TYPE_UPGRADE:
> > +        upgrade_item_unref(display, (UpgradeItem *)item);
> > +        break;
> > +    case PIPE_ITEM_TYPE_IMAGE:
> > +        image_item_unref((ImageItem *)item);
> > +        break;
> > +    case PIPE_ITEM_TYPE_VERB:
> > +        free(item);
> > +        break;
> > +    case PIPE_ITEM_TYPE_MONITORS_CONFIG: {
> > +        MonitorsConfigItem *monconf_item = SPICE_CONTAINEROF(item,
> > +
> >  MonitorsConfigItem, pipe_item);
> > +        monitors_config_unref(monconf_item->monitors_config);
> > +        free(item);
> > +        break;
> > +    }
> > +    default:
> > +        spice_critical("invalid item type");
> > +    }
> > +}
> > +
> > +// TODO: share code between before/after_push since most of the items need
> > the same
> > +// release
> > +static void release_item_before_push(DisplayChannelClient *dcc, PipeItem
> > *item)
> > +{
> > +    DisplayChannel *display = DCC_TO_DC(dcc);
> > +
> > +    spice_debug("item.type: %d", item->type);
> > +    switch (item->type) {
> > +    case PIPE_ITEM_TYPE_DRAW: {
> > +        DrawablePipeItem *dpi = SPICE_CONTAINEROF(item, DrawablePipeItem,
> > dpi_pipe_item);
> > +        ring_remove(&dpi->base);
> > +        drawable_pipe_item_unref(dpi);
> > +        break;
> > +    }
> > +    case PIPE_ITEM_TYPE_STREAM_CREATE: {
> > +        StreamAgent *agent = SPICE_CONTAINEROF(item, StreamAgent,
> > create_item);
> > +        stream_agent_unref(display, agent);
> > +        break;
> > +    }
> > +    case PIPE_ITEM_TYPE_STREAM_CLIP:
> > +        stream_clip_item_unref(dcc, (StreamClipItem *)item);
> > +        break;
> > +    case PIPE_ITEM_TYPE_STREAM_DESTROY: {
> > +        StreamAgent *agent = SPICE_CONTAINEROF(item, StreamAgent,
> > destroy_item);
> > +        stream_agent_unref(display, agent);
> > +        break;
> > +    }
> > +    case PIPE_ITEM_TYPE_UPGRADE:
> > +        upgrade_item_unref(display, (UpgradeItem *)item);
> > +        break;
> > +    case PIPE_ITEM_TYPE_IMAGE:
> > +        image_item_unref((ImageItem *)item);
> > +        break;
> > +    case PIPE_ITEM_TYPE_CREATE_SURFACE: {
> > +        SurfaceCreateItem *surface_create = SPICE_CONTAINEROF(item,
> > SurfaceCreateItem,
> > +                                                              pipe_item);
> > +        free(surface_create);
> > +        break;
> > +    }
> > +    case PIPE_ITEM_TYPE_DESTROY_SURFACE: {
> > +        SurfaceDestroyItem *surface_destroy = SPICE_CONTAINEROF(item,
> > SurfaceDestroyItem,
> > +
> > pipe_item);
> > +        free(surface_destroy);
> > +        break;
> > +    }
> > +    case PIPE_ITEM_TYPE_MONITORS_CONFIG: {
> > +        MonitorsConfigItem *monconf_item = SPICE_CONTAINEROF(item,
> > +
> >  MonitorsConfigItem, pipe_item);
> > +        monitors_config_unref(monconf_item->monitors_config);
> > +        free(item);
> > +        break;
> > +    }
> > +    case PIPE_ITEM_TYPE_INVAL_ONE:
> > +    case PIPE_ITEM_TYPE_VERB:
> > +    case PIPE_ITEM_TYPE_MIGRATE_DATA:
> > +    case PIPE_ITEM_TYPE_PIXMAP_SYNC:
> > +    case PIPE_ITEM_TYPE_PIXMAP_RESET:
> > +    case PIPE_ITEM_TYPE_INVAL_PALETTE_CACHE:
> > +    case PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT:
> > +        free(item);
> > +        break;
> > +    default:
> > +        spice_critical("invalid item type");
> > +    }
> > +}
> > +
> > +void dcc_release_item(DisplayChannelClient *dcc, PipeItem *item, int
> > item_pushed)
> > +{
> > +    if (item_pushed)
> > +        release_item_after_push(dcc, item);
> > +    else
> > +        release_item_before_push(dcc, item);
> > +}
> > diff --git a/server/dcc.h b/server/dcc.h
> > index 94b9195..62261e8 100644
> > --- a/server/dcc.h
> > +++ b/server/dcc.h
> > @@ -195,6 +195,9 @@ void                       dcc_append_drawable
> >            (DisplayCha
> >  void                       dcc_add_drawable_after
> >  (DisplayChannelClient *dcc,
> >                                                                       
> >  Drawable *drawable,
> >                                                                       
> >  PipeItem *pos);
> > +void                       dcc_release_item
> >  (DisplayChannelClient *dcc,
> > +
> >  PipeItem *item,
> > +                                                                      int
> > item_pushed);
> >  
> >  typedef struct compress_send_data_t {
> >      void*    comp_buf;
> > diff --git a/server/display-channel.h b/server/display-channel.h
> > index e26a1d8..e624a6b 100644
> > --- a/server/display-channel.h
> > +++ b/server/display-channel.h
> > @@ -243,6 +243,13 @@ typedef struct SurfaceDestroyItem {
> >      PipeItem pipe_item;
> >  } SurfaceDestroyItem;
> >  
> > +typedef struct UpgradeItem {
> > +    PipeItem base;
> > +    int refs;
> > +    Drawable *drawable;
> > +    SpiceClipRects *rects;
> > +} UpgradeItem;
> > +
> >  
> >  void                       display_channel_free_some
> >  (DisplayChannel *display);
> >  void                       display_channel_set_stream_video
> >  (DisplayChannel *display,
> > diff --git a/server/red_worker.c b/server/red_worker.c
> > index 47b6b82..ac1ef0c 100644
> > --- a/server/red_worker.c
> > +++ b/server/red_worker.c
> > @@ -85,13 +85,6 @@ struct SpiceWatch {
> >  
> >  #define MAX_PIPE_SIZE 50
> >  
> > -typedef struct UpgradeItem {
> > -    PipeItem base;
> > -    int refs;
> > -    Drawable *drawable;
> > -    SpiceClipRects *rects;
> > -} UpgradeItem;
> > -
> >  struct RedWorker {
> >      pthread_t thread;
> >      clockid_t clockid;
> > @@ -148,10 +141,6 @@ static void display_channel_draw(DisplayChannel
> > *display,
> > const SpiceRect *area,
> >  static void display_channel_draw_till(DisplayChannel *display, const
> > SpiceRect *area, int surface_id,
> >                                        Drawable *last);
> >  static inline void display_begin_send_message(RedChannelClient *rcc);
> > -static void
> > display_channel_client_release_item_before_push(DisplayChannelClient *dcc,
> > -                                                            PipeItem
> > *item);
> > -static void
> > display_channel_client_release_item_after_push(DisplayChannelClient *dcc,
> > -                                                           PipeItem
> > *item);
> >  static void red_create_surface(DisplayChannel *display, uint32_t
> >  surface_id,
> > uint32_t width,
> >                                 uint32_t height, int32_t stride, uint32_t
> > format,
> >                                 void *line_0, int data_is_valid, int
> > send_client);
> > @@ -238,23 +227,6 @@ void red_pipes_remove_drawable(Drawable *drawable)
> >      }
> >  }
> >  
> > -static void release_image_item(ImageItem *item)
> > -{
> > -    if (!--item->refs) {
> > -        free(item);
> > -    }
> > -}
> > -
> > -static void upgrade_item_unref(DisplayChannel *display, UpgradeItem *item)
> > -{
> > -    if (--item->refs != 0)
> > -        return;
> > -
> > -    display_channel_drawable_unref(display, item->drawable);
> > -    free(item->rects);
> > -    free(item);
> > -}
> > -
> >  static uint8_t *common_alloc_recv_buf(RedChannelClient *rcc, uint16_t
> >  type,
> > uint32_t size)
> >  {
> >      CommonChannel *common = SPICE_CONTAINEROF(rcc->channel, CommonChannel,
> > base);
> > @@ -3956,7 +3928,7 @@ static void
> > display_channel_send_item(RedChannelClient
> > *rcc, PipeItem *pipe_item
> >          spice_error("invalid pipe item type");
> >      }
> >  
> > -    display_channel_client_release_item_before_push(dcc, pipe_item);
> > +    dcc_release_item(dcc, pipe_item, FALSE);
> >  
> >      // a message is pending
> >      if (red_channel_client_send_message_pending(rcc)) {
> > @@ -4477,116 +4449,12 @@ static void
> > display_channel_hold_pipe_item(RedChannelClient *rcc, PipeItem *item
> >      }
> >  }
> >  
> > -static void
> > display_channel_client_release_item_after_push(DisplayChannelClient *dcc,
> > -                                                           PipeItem *item)
> > -{
> > -    DisplayChannel *display = DCC_TO_DC(dcc);
> > -
> > -    switch (item->type) {
> > -    case PIPE_ITEM_TYPE_DRAW:
> > -        drawable_pipe_item_unref(SPICE_CONTAINEROF(item, DrawablePipeItem,
> > dpi_pipe_item));
> > -        break;
> > -    case PIPE_ITEM_TYPE_STREAM_CLIP:
> > -        stream_clip_item_unref(dcc, (StreamClipItem *)item);
> > -        break;
> > -    case PIPE_ITEM_TYPE_UPGRADE:
> > -        upgrade_item_unref(display, (UpgradeItem *)item);
> > -        break;
> > -    case PIPE_ITEM_TYPE_IMAGE:
> > -        release_image_item((ImageItem *)item);
> > -        break;
> > -    case PIPE_ITEM_TYPE_VERB:
> > -        free(item);
> > -        break;
> > -    case PIPE_ITEM_TYPE_MONITORS_CONFIG: {
> > -        MonitorsConfigItem *monconf_item = SPICE_CONTAINEROF(item,
> > -
> >  MonitorsConfigItem, pipe_item);
> > -        monitors_config_unref(monconf_item->monitors_config);
> > -        free(item);
> > -        break;
> > -    }
> > -    default:
> > -        spice_critical("invalid item type");
> > -    }
> > -}
> > -
> > -// TODO: share code between before/after_push since most of the items need
> > the same
> > -// release
> > -static void
> > display_channel_client_release_item_before_push(DisplayChannelClient *dcc,
> > -                                                            PipeItem
> > *item)
> > -{
> > -    DisplayChannel *display = DCC_TO_DC(dcc);
> > -
> > -    switch (item->type) {
> > -    case PIPE_ITEM_TYPE_DRAW: {
> > -        DrawablePipeItem *dpi = SPICE_CONTAINEROF(item, DrawablePipeItem,
> > dpi_pipe_item);
> > -        ring_remove(&dpi->base);
> > -        drawable_pipe_item_unref(dpi);
> > -        break;
> > -    }
> > -    case PIPE_ITEM_TYPE_STREAM_CREATE: {
> > -        StreamAgent *agent = SPICE_CONTAINEROF(item, StreamAgent,
> > create_item);
> > -        stream_agent_unref(display, agent);
> > -        break;
> > -    }
> > -    case PIPE_ITEM_TYPE_STREAM_CLIP:
> > -        stream_clip_item_unref(dcc, (StreamClipItem *)item);
> > -        break;
> > -    case PIPE_ITEM_TYPE_STREAM_DESTROY: {
> > -        StreamAgent *agent = SPICE_CONTAINEROF(item, StreamAgent,
> > destroy_item);
> > -        stream_agent_unref(display, agent);
> > -        break;
> > -    }
> > -    case PIPE_ITEM_TYPE_UPGRADE:
> > -        upgrade_item_unref(display, (UpgradeItem *)item);
> > -        break;
> > -    case PIPE_ITEM_TYPE_IMAGE:
> > -        release_image_item((ImageItem *)item);
> > -        break;
> > -    case PIPE_ITEM_TYPE_CREATE_SURFACE: {
> > -        SurfaceCreateItem *surface_create = SPICE_CONTAINEROF(item,
> > SurfaceCreateItem,
> > -                                                              pipe_item);
> > -        free(surface_create);
> > -        break;
> > -    }
> > -    case PIPE_ITEM_TYPE_DESTROY_SURFACE: {
> > -        SurfaceDestroyItem *surface_destroy = SPICE_CONTAINEROF(item,
> > SurfaceDestroyItem,
> > -
> > pipe_item);
> > -        free(surface_destroy);
> > -        break;
> > -    }
> > -    case PIPE_ITEM_TYPE_MONITORS_CONFIG: {
> > -        MonitorsConfigItem *monconf_item = SPICE_CONTAINEROF(item,
> > -
> >  MonitorsConfigItem, pipe_item);
> > -        monitors_config_unref(monconf_item->monitors_config);
> > -        free(item);
> > -        break;
> > -    }
> > -    case PIPE_ITEM_TYPE_INVAL_ONE:
> > -    case PIPE_ITEM_TYPE_VERB:
> > -    case PIPE_ITEM_TYPE_MIGRATE_DATA:
> > -    case PIPE_ITEM_TYPE_PIXMAP_SYNC:
> > -    case PIPE_ITEM_TYPE_PIXMAP_RESET:
> > -    case PIPE_ITEM_TYPE_INVAL_PALETTE_CACHE:
> > -    case PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT:
> > -        free(item);
> > -        break;
> > -    default:
> > -        spice_critical("invalid item type");
> > -    }
> > -}
> > -
> >  static void display_channel_release_item(RedChannelClient *rcc, PipeItem
> > *item, int item_pushed)
> >  {
> >      DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
> >  
> >      spice_assert(item);
> > -    if (item_pushed) {
> > -        display_channel_client_release_item_after_push(dcc, item);
> > -    } else {
> > -        spice_debug("not pushed (%d)", item->type);
> > -        display_channel_client_release_item_before_push(dcc, item);
> > -    }
> > +    dcc_release_item(dcc, item, item_pushed);
> >  }
> >  
> >  static void display_channel_create(RedWorker *worker, int migrate, int
> > stream_video,
> 
> 
> Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
> 

Merged

Frediano


More information about the Spice-devel mailing list