From: Marc-André Lureau <marcandre.lureau@xxxxxxxxx> --- 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, -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel