[Spice-devel] [PATCH 09/18] worker: move dcc_release_item
Jonathon Jongsma
jjongsma at redhat.com
Mon Nov 23 13:54:10 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>
More information about the Spice-devel
mailing list