[Spice-devel] [PATCH 07/18] server/red_worker: extract common_release_pipe_item from red_pipe_clear

Alon Levy alevy at redhat.com
Thu Feb 10 07:00:12 PST 2011


On Tue, Feb 08, 2011 at 10:07:40PM +0100, Marc-André Lureau wrote:
> Hopefully we can find a more elegant solution to the downcasting
> introduced in patch 03: CommonChannel *common =
> SPICE_CONTAINEROF(channel, CommonChannel, base);
> 
> I would rather modify the function common_release_pipe_item(RedChannel
> *channel, PipeItem *item) to be:
> common_release_pipe_item(CommonChannel *common, PipeItem *item).
> 

ok, I'll do that.

> On Mon, Feb 7, 2011 at 7:19 PM, Alon Levy <alevy at redhat.com> wrote:
> > ---
> >  server/red_worker.c |  106 +++++++++++++++++++++++++++------------------------
> >  1 files changed, 56 insertions(+), 50 deletions(-)
> >
> > diff --git a/server/red_worker.c b/server/red_worker.c
> > index 76d0ef6..08aeef2 100644
> > --- a/server/red_worker.c
> > +++ b/server/red_worker.c
> > @@ -1354,63 +1354,69 @@ static void release_upgrade_item(RedWorker* worker, UpgradeItem *item)
> >     }
> >  }
> >
> > +static void common_release_pipe_item(RedChannel *channel, PipeItem *item)
> > +{
> > +    CommonChannel *common = SPICE_CONTAINEROF(channel, CommonChannel, base);
> > +
> > +    switch (item->type) {
> > +    case PIPE_ITEM_TYPE_DRAW:
> > +        release_drawable(common->worker, SPICE_CONTAINEROF(item, Drawable, pipe_item));
> > +        break;
> > +    case PIPE_ITEM_TYPE_CURSOR:
> > +        red_release_cursor(common->worker, (CursorItem *)item);
> > +        break;
> > +    case PIPE_ITEM_TYPE_UPGRADE:
> > +        release_upgrade_item(common->worker, (UpgradeItem *)item);
> > +        break;
> > +    case PIPE_ITEM_TYPE_PIXMAP_RESET:
> > +    case PIPE_ITEM_TYPE_PIXMAP_SYNC:
> > +    case PIPE_ITEM_TYPE_INVAL_ONE:
> > +    case PIPE_ITEM_TYPE_MIGRATE:
> > +    case PIPE_ITEM_TYPE_SET_ACK:
> > +    case PIPE_ITEM_TYPE_CURSOR_INIT:
> > +    case PIPE_ITEM_TYPE_VERB:
> > +    case PIPE_ITEM_TYPE_MIGRATE_DATA:
> > +    case PIPE_ITEM_TYPE_INVAL_PALLET_CACHE:
> > +    case PIPE_ITEM_TYPE_INVAL_CURSOR_CACHE:
> > +        free(item);
> > +        break;
> > +    case PIPE_ITEM_TYPE_IMAGE:
> > +        release_image_item((ImageItem *)item);
> > +        break;
> > +    case PIPE_ITEM_TYPE_STREAM_CREATE:
> > +        red_display_release_stream((DisplayChannel *)channel,
> > +                                   SPICE_CONTAINEROF(item, StreamAgent, create_item));
> > +        break;
> > +    case PIPE_ITEM_TYPE_STREAM_CLIP:
> > +        red_display_release_stream_clip((DisplayChannel *)channel, (StreamClipItem*)item);
> > +        break;
> > +    case PIPE_ITEM_TYPE_STREAM_DESTROY:
> > +        red_display_release_stream((DisplayChannel *)channel,
> > +                                   SPICE_CONTAINEROF(item, StreamAgent, destroy_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;
> > +    }
> > +    }
> > +}
> > +
> >  static void red_pipe_clear(RedChannel *channel)
> >  {
> >     PipeItem *item;
> > -    CommonChannel *common = SPICE_CONTAINEROF(channel, CommonChannel, base);
> >
> >     ASSERT(channel);
> >     while ((item = (PipeItem *)ring_get_head(&channel->pipe))) {
> >         ring_remove(&item->link);
> > -        switch (item->type) {
> > -        case PIPE_ITEM_TYPE_DRAW:
> > -            release_drawable(common->worker, SPICE_CONTAINEROF(item, Drawable, pipe_item));
> > -            break;
> > -        case PIPE_ITEM_TYPE_CURSOR:
> > -            red_release_cursor(common->worker, (CursorItem *)item);
> > -            break;
> > -        case PIPE_ITEM_TYPE_UPGRADE:
> > -            release_upgrade_item(common->worker, (UpgradeItem *)item);
> > -            break;
> > -        case PIPE_ITEM_TYPE_PIXMAP_RESET:
> > -        case PIPE_ITEM_TYPE_PIXMAP_SYNC:
> > -        case PIPE_ITEM_TYPE_INVAL_ONE:
> > -        case PIPE_ITEM_TYPE_MIGRATE:
> > -        case PIPE_ITEM_TYPE_SET_ACK:
> > -        case PIPE_ITEM_TYPE_CURSOR_INIT:
> > -        case PIPE_ITEM_TYPE_VERB:
> > -        case PIPE_ITEM_TYPE_MIGRATE_DATA:
> > -        case PIPE_ITEM_TYPE_INVAL_PALLET_CACHE:
> > -        case PIPE_ITEM_TYPE_INVAL_CURSOR_CACHE:
> > -            free(item);
> > -            break;
> > -        case PIPE_ITEM_TYPE_IMAGE:
> > -            release_image_item((ImageItem *)item);
> > -            break;
> > -        case PIPE_ITEM_TYPE_STREAM_CREATE:
> > -            red_display_release_stream((DisplayChannel *)channel,
> > -                                       SPICE_CONTAINEROF(item, StreamAgent, create_item));
> > -            break;
> > -        case PIPE_ITEM_TYPE_STREAM_CLIP:
> > -            red_display_release_stream_clip((DisplayChannel *)channel, (StreamClipItem*)item);
> > -            break;
> > -        case PIPE_ITEM_TYPE_STREAM_DESTROY:
> > -            red_display_release_stream((DisplayChannel *)channel,
> > -                                       SPICE_CONTAINEROF(item, StreamAgent, destroy_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;
> > -        }
> > -        }
> > +        common_release_pipe_item(channel, item);
> >     }
> >     channel->pipe_size = 0;
> >  }
> > --
> > 1.7.4
> >
> > _______________________________________________
> > Spice-devel mailing list
> > Spice-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/spice-devel
> >
> 
> 
> 
> -- 
> Marc-André Lureau


More information about the Spice-devel mailing list