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). On Mon, Feb 7, 2011 at 7:19 PM, Alon Levy <al...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/spice-devel > -- Marc-André Lureau _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel