[Spice-devel] [PATCH 09/19] worker: move dcc_send & marshallers to dcc-send.c
Frediano Ziglio
fziglio at redhat.com
Thu Nov 26 02:46:32 PST 2015
>
> >
> > This patch is freaking huge :-\
> > Is there some automated way to check whether a function move is just a
> > move or something else changed?
> >
>
> Do you mean something like this?
>
>
> --- before.c 2015-11-26 09:57:02.327008820 +0000
> +++ after.c 2015-11-26 09:19:38.642524996 +0000
> @@ -34,20 +34,22 @@
> #define DISPLAY_CLIENT_TIMEOUT 30000000000ULL //nano
> #define DISPLAY_CLIENT_MIGRATE_DATA_TIMEOUT 10000000000ULL //nano, 10 sec
> #define DISPLAY_CLIENT_RETRY_INTERVAL 10000 //micro
>
> /* Each drawable can refer to at most 3 images: src, brush and mask */
> #define MAX_DRAWABLE_PIXMAP_CACHE_ITEMS 3
>
> #define WIDE_CLIENT_ACK_WINDOW 40
> #define NARROW_CLIENT_ACK_WINDOW 20
>
> +#define MAX_PIPE_SIZE 50
> +
> typedef struct WaitForChannels {
> SpiceMsgWaitForChannels header;
> SpiceWaitForChannel buf[MAX_CACHE_CLIENTS];
> } WaitForChannels;
>
> typedef struct FreeList {
> int res_size;
> SpiceResourceList *res;
> uint64_t sync[MAX_CACHE_CLIENTS];
> WaitForChannels wait;
> @@ -367,20 +369,21 @@
> pixmap-cache.c \
> tree.h \
> tree.c \
> spice-bitmap-utils.h \
> spice-bitmap-utils.c \
> utils.c \
> utils.h \
> stream.c \
> stream.h \
> dcc.c \
> + dcc-send.c \
> dcc.h \
> display-limits.h \
> dcc-encoders.c \
> dcc-encoders.h \
> $(NULL)
>
> if HAVE_SMARTCARD
> libspice_server_la_SOURCES += \
> smartcard.c \
> smartcard.h \
> @@ -516,24 +519,20 @@
> out_lossy_area->top = lossy_region.extents.y1;
> out_lossy_area->right = lossy_region.extents.x2;
> out_lossy_area->bottom = lossy_region.extents.y2;
> region_destroy(&lossy_region);
> return TRUE;
> } else {
> return FALSE;
> }
> }
>
> -/* returns if the bitmap was already sent lossy to the client. If the bitmap
> hasn't been sent yet
> - to the client, returns false. "area" is for surfaces. If area = NULL,
> - all the surface is considered. out_lossy_data will hold info about the
> bitmap, and its lossy
> - area in case it is lossy and part of a surface. */
Note that this comment was moved in front to another function, I'll revert
this change and ack the patch.
> static int is_bitmap_lossy(RedChannelClient *rcc, SpiceImage *image,
> SpiceRect *area,
> Drawable *drawable, BitmapData *out_data)
> {
> DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
>
> if (image == NULL) {
> // self bitmap
> out_data->type = BITMAP_DATA_TYPE_BITMAP;
> return FALSE;
> }
> @@ -608,73 +607,73 @@
> stat_inc_counter(display_channel->add_to_cache_counter, 1);
> }
> }
> }
>
> if (!(io_image->descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME)) {
> stat_inc_counter(display_channel->non_cache_counter, 1);
> }
> }
>
> -static inline void display_marshal_sub_msg_inval_list(SpiceMarshaller *m,
> +static void marshal_sub_msg_inval_list(SpiceMarshaller *m,
> FreeList *free_list)
> {
> /* type + size + submessage */
> spice_marshaller_add_uint16(m, SPICE_MSG_DISPLAY_INVAL_LIST);
> spice_marshaller_add_uint32(m, sizeof(*free_list->res) +
> free_list->res->count *
> sizeof(free_list->res->resources[0]));
> spice_marshall_msg_display_inval_list(m, free_list->res);
> }
>
> -static inline void display_marshal_sub_msg_inval_list_wait(SpiceMarshaller
> *m,
> +static void marshal_sub_msg_inval_list_wait(SpiceMarshaller *m,
> FreeList
> *free_list)
> {
> /* type + size + submessage */
> spice_marshaller_add_uint16(m, SPICE_MSG_WAIT_FOR_CHANNELS);
> spice_marshaller_add_uint32(m, sizeof(free_list->wait.header) +
> free_list->wait.header.wait_count *
> sizeof(free_list->wait.buf[0]));
> spice_marshall_msg_wait_for_channels(m, &free_list->wait.header);
> }
>
> /* use legacy SpiceDataHeader (with sub_list) */
> -static inline void display_channel_send_free_list_legacy(RedChannelClient
> *rcc)
> +static void send_free_list_legacy(RedChannelClient *rcc)
> {
> DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
> FreeList *free_list = &dcc->send_data.free_list;
> SpiceMarshaller *marshaller;
> int sub_list_len = 1;
> SpiceMarshaller *wait_m = NULL;
> SpiceMarshaller *inval_m;
> SpiceMarshaller *sub_list_m;
>
> marshaller = red_channel_client_get_marshaller(rcc);
> inval_m = spice_marshaller_get_submarshaller(marshaller);
>
> - display_marshal_sub_msg_inval_list(inval_m, free_list);
> + marshal_sub_msg_inval_list(inval_m, free_list);
>
> if (free_list->wait.header.wait_count) {
> wait_m = spice_marshaller_get_submarshaller(marshaller);
> - display_marshal_sub_msg_inval_list_wait(wait_m, free_list);
> + marshal_sub_msg_inval_list_wait(wait_m, free_list);
> sub_list_len++;
> }
>
> sub_list_m = spice_marshaller_get_submarshaller(marshaller);
> spice_marshaller_add_uint16(sub_list_m, sub_list_len);
> if (wait_m) {
> spice_marshaller_add_uint32(sub_list_m,
> spice_marshaller_get_offset(wait_m));
> }
> spice_marshaller_add_uint32(sub_list_m,
> spice_marshaller_get_offset(inval_m));
> red_channel_client_set_header_sub_list(rcc,
> spice_marshaller_get_offset(sub_list_m));
> }
>
> /* use mini header and SPICE_MSG_LIST */
> -static inline void display_channel_send_free_list(RedChannelClient *rcc)
> +static void send_free_list(RedChannelClient *rcc)
> {
> DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
> FreeList *free_list = &dcc->send_data.free_list;
> int sub_list_len = 1;
> SpiceMarshaller *urgent_marshaller;
> SpiceMarshaller *wait_m = NULL;
> SpiceMarshaller *inval_m;
> uint32_t sub_arr_offset;
> uint32_t wait_offset = 0;
> uint32_t inval_offset = 0;
> @@ -693,25 +692,25 @@
>
> if (free_list->wait.header.wait_count) {
> red_channel_client_init_send_data(rcc, SPICE_MSG_LIST, NULL);
> } else { /* only one message, no need for a list */
> red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_INVAL_LIST,
> NULL);
> spice_marshall_msg_display_inval_list(urgent_marshaller,
> free_list->res);
> return;
> }
>
> inval_m = spice_marshaller_get_submarshaller(urgent_marshaller);
> - display_marshal_sub_msg_inval_list(inval_m, free_list);
> + marshal_sub_msg_inval_list(inval_m, free_list);
>
> if (free_list->wait.header.wait_count) {
> wait_m = spice_marshaller_get_submarshaller(urgent_marshaller);
> - display_marshal_sub_msg_inval_list_wait(wait_m, free_list);
> + marshal_sub_msg_inval_list_wait(wait_m, free_list);
> sub_list_len++;
> }
>
> sub_arr_offset = sub_list_len * sizeof(uint32_t);
>
> spice_marshaller_add_uint16(urgent_marshaller, sub_list_len);
> inval_offset = spice_marshaller_get_offset(inval_m); // calc the offset
> before
> // adding the sub
> list
> // offsets array to
> the marshaller
> /* adding the array of offsets */
> @@ -903,21 +902,21 @@
> {
> int i;
>
> if (m && attr->style_nseg) {
> for (i = 0 ; i < attr->style_nseg; i++) {
> spice_marshaller_add_uint32(m, attr->style[i]);
> }
> }
> }
>
> -static void red_marshall_qxl_draw_fill(RedChannelClient *rcc,
> +static void marshall_qxl_draw_fill(RedChannelClient *rcc,
> SpiceMarshaller *base_marshaller,
> DrawablePipeItem *dpi)
> {
> Drawable *item = dpi->drawable;
> RedDrawable *drawable = item->red_drawable;
> DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
> SpiceMarshaller *brush_pat_out;
> SpiceMarshaller *mask_bitmap_out;
> SpiceFill fill;
>
> @@ -929,20 +928,24 @@
> &brush_pat_out,
> &mask_bitmap_out);
>
> if (brush_pat_out) {
> fill_bits(dcc, brush_pat_out, fill.brush.u.pattern.pat, item,
> FALSE);
> }
>
> fill_mask(rcc, mask_bitmap_out, fill.mask.bitmap, item);
> }
>
> +/* returns if the bitmap was already sent lossy to the client. If the bitmap
> hasn't been sent yet
> + to the client, returns false. "area" is for surfaces. If area = NULL,
> + all the surface is considered. out_lossy_data will hold info about the
> bitmap, and its lossy
> + area in case it is lossy and part of a surface. */
Here you are the comment moved to another function
> static void surface_lossy_region_update(DisplayChannelClient *dcc,
> Drawable *item, int has_mask, int
> lossy)
> {
> QRegion *surface_lossy_region;
> RedDrawable *drawable;
>
> if (has_mask && !lossy) {
> return;
> }
>
> @@ -967,21 +970,21 @@
> region_destroy(&draw_region);
> } else { /* no clip */
> if (!lossy) {
> region_remove(surface_lossy_region, &drawable->bbox);
> } else {
> region_add(surface_lossy_region, &drawable->bbox);
> }
> }
> }
>
> -static inline int drawable_intersects_with_areas(Drawable *drawable, int
> surface_ids[],
> +static int drawable_intersects_with_areas(Drawable *drawable, int
> surface_ids[],
> SpiceRect *surface_areas[],
> int num_surfaces)
> {
> int i;
> for (i = 0; i < num_surfaces; i++) {
> if (surface_ids[i] == drawable->red_drawable->surface_id) {
> if (rect_intersects(surface_areas[i],
> &drawable->red_drawable->bbox)) {
> return TRUE;
> }
> }
> @@ -1014,24 +1017,22 @@
> continue; // item hasn't been rendered
>
> if (drawable_intersects_with_areas(drawable, surface_ids,
> surface_areas, num_surfaces)) {
> return TRUE;
> }
> }
>
> return FALSE;
> }
>
> -static inline int drawable_depends_on_areas(Drawable *drawable,
> - int surface_ids[],
> - SpiceRect surface_areas[],
> - int num_surfaces)
> +static int drawable_depends_on_areas(Drawable *drawable, int surface_ids[],
> + SpiceRect surface_areas[], int
> num_surfaces)
> {
> int i;
> RedDrawable *red_drawable;
> int drawable_has_shadow;
> SpiceRect shadow_rect = {0, 0, 0, 0};
>
> red_drawable = drawable->red_drawable;
> drawable_has_shadow = has_shadow(red_drawable);
>
> if (drawable_has_shadow) {
> @@ -1227,21 +1228,21 @@
> &brush_bitmap_data);
> if (!dest_allowed_lossy) {
> dest_is_lossy = is_surface_area_lossy(dcc, item->surface_id,
> &drawable->bbox,
> &dest_lossy_area);
> }
>
> if (!dest_is_lossy &&
> !(brush_is_lossy && (brush_bitmap_data.type ==
> BITMAP_DATA_TYPE_SURFACE))) {
> int has_mask = !!drawable->u.fill.mask.bitmap;
>
> - red_marshall_qxl_draw_fill(rcc, m, dpi);
> + marshall_qxl_draw_fill(rcc, m, dpi);
> // either the brush operation is opaque, or the dest is not lossy
> surface_lossy_region_update(dcc, item, has_mask, FALSE);
> } else {
> int resend_surface_ids[2];
> SpiceRect *resend_areas[2];
> int num_resend = 0;
>
> if (dest_is_lossy) {
> resend_surface_ids[num_resend] = item->surface_id;
> resend_areas[num_resend] = &dest_lossy_area;
> @@ -2161,21 +2162,21 @@
> agent->last_send_time = time_now;
> #ifdef STREAM_STATS
> agent->stats.num_frames_sent++;
> agent->stats.size_sent += n;
> agent->stats.end = frame_mm_time;
> #endif
>
> return TRUE;
> }
>
> -static inline void red_marshall_inval_palette(RedChannelClient *rcc,
> +static inline void marshall_inval_palette(RedChannelClient *rcc,
> SpiceMarshaller
> *base_marshaller,
> CacheItem *cache_item)
> {
> SpiceMsgDisplayInvalOne inval_one;
>
> red_channel_client_init_send_data(rcc, cache_item->inval_type, NULL);
> inval_one.id = *(uint64_t *)&cache_item->id;
>
> spice_marshall_msg_display_inval_palette(base_marshaller, &inval_one);
>
> @@ -2394,41 +2395,39 @@
> if (grad_level == BITMAP_GRADUAL_HIGH) {
> // if we use lz for alpha, the stride can't be extra
> lossy_comp = display->enable_jpeg && item->can_lossy;
> quic_comp = TRUE;
> }
> }
> } else if (comp_mode == SPICE_IMAGE_COMPRESSION_QUIC) {
> quic_comp = TRUE;
> }
>
> + uint32_t groupid =
> red_worker_get_memslot(worker)->internal_groupslot_id;
> +
> if (lossy_comp) {
> - comp_succeeded = dcc_compress_image_jpeg(dcc, &red_image,
> - &bitmap, &comp_send_data,
> -
> worker->mem_slots.internal_groupslot_id);
> + comp_succeeded = dcc_compress_image_jpeg(dcc, &red_image, &bitmap,
> &comp_send_data, groupid);
> } else if (quic_comp) {
> - comp_succeeded = dcc_compress_image_quic(dcc, &red_image, &bitmap,
> - &comp_send_data,
> -
> worker->mem_slots.internal_groupslot_id);
> + comp_succeeded = dcc_compress_image_quic(dcc, &red_image, &bitmap,
> &comp_send_data, groupid);
> #ifdef USE_LZ4
> } else if (comp_mode == SPICE_IMAGE_COMPRESSION_LZ4 &&
> bitmap_fmt_is_rgb(bitmap.format) &&
> red_channel_client_test_remote_cap(&dcc->common.base,
> SPICE_DISPLAY_CAP_LZ4_COMPRESSION))
> {
> comp_succeeded = dcc_compress_image_lz4(dcc, &red_image, &bitmap,
> &comp_send_data,
> -
> worker->mem_slots.internal_groupslot_id);
> + groupid);
> #endif
> } else if (comp_mode != SPICE_IMAGE_COMPRESSION_OFF) {
> comp_succeeded = dcc_compress_image_lz(dcc, &red_image, &bitmap,
> &comp_send_data,
> -
> worker->mem_slots.internal_groupslot_id);
> + groupid);
> }
>
> surface_lossy_region =
> &dcc->surface_client_lossy_region[item->surface_id];
> if (comp_succeeded) {
> spice_marshall_Image(src_bitmap_out, &red_image,
> &bitmap_palette_out, &lzplt_palette_out);
>
> marshaller_add_compressed(src_bitmap_out,
> comp_send_data.comp_buf,
> comp_send_data.comp_buf_size);
>
> @@ -2447,21 +2446,21 @@
>
> spice_marshall_Image(src_bitmap_out, &red_image,
> &bitmap_palette_out, &lzplt_palette_out);
> spice_marshaller_add_ref(src_bitmap_out, item->data,
> bitmap.y * bitmap.stride);
> region_remove(surface_lossy_region, ©.base.box);
> }
> spice_chunks_destroy(chunks);
> }
>
> -static void red_lossy_marshall_qxl_drawable(RedChannelClient *rcc,
> +static void marshall_lossy_qxl_drawable(RedChannelClient *rcc,
> SpiceMarshaller
> *base_marshaller,
> DrawablePipeItem *dpi)
> {
> Drawable *item = dpi->drawable;
> switch (item->red_drawable->type) {
> case QXL_DRAW_FILL:
> red_lossy_marshall_qxl_draw_fill(rcc, base_marshaller, dpi);
> break;
> case QXL_DRAW_OPAQUE:
> red_lossy_marshall_qxl_draw_opaque(rcc, base_marshaller, dpi);
> @@ -2496,33 +2495,33 @@
> case QXL_DRAW_COMPOSITE:
> red_lossy_marshall_qxl_draw_composite(rcc, base_marshaller, dpi);
> break;
> case QXL_DRAW_STROKE:
> red_lossy_marshall_qxl_draw_stroke(rcc, base_marshaller, dpi);
> break;
> case QXL_DRAW_TEXT:
> red_lossy_marshall_qxl_draw_text(rcc, base_marshaller, dpi);
> break;
> default:
> - spice_error("invalid type");
> + spice_warn_if_reached();
> }
> }
>
> -static inline void red_marshall_qxl_drawable(RedChannelClient *rcc,
> +static void marshall_lossless_qxl_drawable(RedChannelClient *rcc,
> SpiceMarshaller *m,
> DrawablePipeItem *dpi)
> {
> Drawable *item = dpi->drawable;
> RedDrawable *drawable = item->red_drawable;
>
> switch (drawable->type) {
> case QXL_DRAW_FILL:
> - red_marshall_qxl_draw_fill(rcc, m, dpi);
> + marshall_qxl_draw_fill(rcc, m, dpi);
> break;
> case QXL_DRAW_OPAQUE:
> red_marshall_qxl_draw_opaque(rcc, m, dpi, FALSE);
> break;
> case QXL_DRAW_COPY:
> red_marshall_qxl_draw_copy(rcc, m, dpi, FALSE);
> break;
> case QXL_DRAW_TRANSPARENT:
> red_marshall_qxl_draw_transparent(rcc, m, dpi);
> break;
> @@ -2550,43 +2549,44 @@
> case QXL_DRAW_STROKE:
> red_marshall_qxl_draw_stroke(rcc, m, dpi);
> break;
> case QXL_DRAW_COMPOSITE:
> red_marshall_qxl_draw_composite(rcc, m, dpi);
> break;
> case QXL_DRAW_TEXT:
> red_marshall_qxl_draw_text(rcc, m, dpi);
> break;
> default:
> - spice_error("invalid type");
> + spice_warn_if_reached();
> }
> }
>
> -static inline void marshall_qxl_drawable(RedChannelClient *rcc,
> +static void marshall_qxl_drawable(RedChannelClient *rcc,
> SpiceMarshaller *m, DrawablePipeItem *dpi)
> {
> Drawable *item = dpi->drawable;
> DisplayChannel *display = SPICE_CONTAINEROF(rcc->channel,
> DisplayChannel, common.base);
>
> - spice_assert(display && rcc);
> + spice_return_if_fail(display);
> + spice_return_if_fail(rcc);
Here there is a bug. rcc is tested for NULL after being used to initialize display.
This is not a regression however.
I'll move the spice_return_if_fail(rcc) at the beginning of the function.
Returning here is not a problem.
> /* allow sized frames to be streamed, even if they where replaced by
> another frame, since
> * newer frames might not cover sized frames completely if they are
> bigger */
> if ((item->stream || item->sized_stream) &&
> red_marshall_stream_data(rcc, m, item)) {
> return;
> }
> - if (!display->enable_jpeg)
> - red_marshall_qxl_drawable(rcc, m, dpi);
> + if (display->enable_jpeg)
> + marshall_lossy_qxl_drawable(rcc, m, dpi);
> else
> - red_lossy_marshall_qxl_drawable(rcc, m, dpi);
> + marshall_lossless_qxl_drawable(rcc, m, dpi);
> }
>
> -static void red_display_marshall_stream_start(RedChannelClient *rcc,
> +static void marshall_stream_start(RedChannelClient *rcc,
> SpiceMarshaller *base_marshaller, StreamAgent *agent)
> {
> DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
> Stream *stream = agent->stream;
>
> agent->last_send_time = 0;
> spice_assert(stream);
> red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_STREAM_CREATE,
> NULL);
> SpiceMsgDisplayStreamCreate stream_create;
> SpiceClipRects clip_rects;
> @@ -2609,52 +2609,52 @@
> stream_create.clip.type = SPICE_CLIP_TYPE_RECTS;
> clip_rects.num_rects = 0;
> stream_create.clip.rects = &clip_rects;
> }
>
> stream_create.stamp = 0;
>
> spice_marshall_msg_display_stream_create(base_marshaller,
> &stream_create);
> }
>
> -static void red_display_marshall_stream_clip(RedChannelClient *rcc,
> +static void marshall_stream_clip(RedChannelClient *rcc,
> SpiceMarshaller *base_marshaller,
> StreamClipItem *item)
> {
> DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
> StreamAgent *agent = item->stream_agent;
>
> - spice_assert(agent->stream);
> + spice_return_if_fail(agent->stream);
>
> red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_STREAM_CLIP,
> &item->base);
> SpiceMsgDisplayStreamClip stream_clip;
>
> stream_clip.id = get_stream_id(DCC_TO_DC(dcc), agent->stream);
> stream_clip.clip.type = item->clip_type;
> stream_clip.clip.rects = item->rects;
>
> spice_marshall_msg_display_stream_clip(base_marshaller, &stream_clip);
> }
>
> -static void red_display_marshall_stream_end(RedChannelClient *rcc,
> +static void marshall_stream_end(RedChannelClient *rcc,
> SpiceMarshaller *base_marshaller, StreamAgent* agent)
> {
> DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
> SpiceMsgDisplayStreamDestroy destroy;
>
> red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_STREAM_DESTROY,
> NULL);
> destroy.id = get_stream_id(DCC_TO_DC(dcc), agent->stream);
> stream_agent_stop(agent);
> spice_marshall_msg_display_stream_destroy(base_marshaller, &destroy);
> }
>
> -static void red_display_marshall_upgrade(RedChannelClient *rcc,
> SpiceMarshaller *m,
> +static void marshall_upgrade(RedChannelClient *rcc, SpiceMarshaller *m,
> UpgradeItem *item)
> {
> DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
> RedDrawable *red_drawable;
> SpiceMsgDisplayDrawCopy copy;
> SpiceMarshaller *src_bitmap_out, *mask_bitmap_out;
>
> spice_assert(rcc && rcc->channel && item && item->drawable);
> red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_DRAW_COPY,
> &item->base);
>
> @@ -2668,46 +2668,47 @@
> copy.base.clip.type = SPICE_CLIP_TYPE_RECTS;
> copy.base.clip.rects = item->rects;
> copy.data = red_drawable->u.copy;
>
> spice_marshall_msg_display_draw_copy(m, ©,
> &src_bitmap_out, &mask_bitmap_out);
>
> fill_bits(dcc, src_bitmap_out, copy.data.src_bitmap, item->drawable,
> FALSE);
> }
>
> -static void red_marshall_surface_create(RedChannelClient *rcc,
> - SpiceMarshaller *base_marshaller, SpiceMsgSurfaceCreate *surface_create)
> +static void marshall_surface_create(RedChannelClient *rcc,
> + SpiceMarshaller *base_marshaller,
> + SpiceMsgSurfaceCreate *surface_create)
> {
> DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
>
> region_init(&dcc->surface_client_lossy_region[surface_create->surface_id]);
> red_channel_client_init_send_data(rcc, SPICE_MSG_DISPLAY_SURFACE_CREATE,
> NULL);
>
> spice_marshall_msg_display_surface_create(base_marshaller,
> surface_create);
> }
>
> -static void red_marshall_surface_destroy(RedChannelClient *rcc,
> +static void marshall_surface_destroy(RedChannelClient *rcc,
> SpiceMarshaller *base_marshaller, uint32_t surface_id)
> {
> DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
> SpiceMsgSurfaceDestroy surface_destroy;
>
> region_destroy(&dcc->surface_client_lossy_region[surface_id]);
> red_channel_client_init_send_data(rcc,
> SPICE_MSG_DISPLAY_SURFACE_DESTROY, NULL);
>
> surface_destroy.surface_id = surface_id;
>
> spice_marshall_msg_display_surface_destroy(base_marshaller,
> &surface_destroy);
> }
>
> -static void red_marshall_monitors_config(RedChannelClient *rcc,
> SpiceMarshaller *base_marshaller,
> +static void marshall_monitors_config(RedChannelClient *rcc, SpiceMarshaller
> *base_marshaller,
> MonitorsConfig *monitors_config)
> {
> int heads_size = sizeof(SpiceHead) * monitors_config->count;
> int i;
> SpiceMsgDisplayMonitorsConfig *msg = spice_malloc0(sizeof(*msg) +
> heads_size);
> int count = 0; // ignore monitors_config->count, it may contain zero
> width monitors, remove them now
>
> red_channel_client_init_send_data(rcc,
> SPICE_MSG_DISPLAY_MONITORS_CONFIG, NULL);
> for (i = 0 ; i < monitors_config->count; ++i) {
> if (monitors_config->heads[i].width == 0 ||
> monitors_config->heads[i].height == 0) {
> @@ -2720,58 +2721,58 @@
> msg->heads[count].x = monitors_config->heads[i].x;
> msg->heads[count].y = monitors_config->heads[i].y;
> count++;
> }
> msg->count = count;
> msg->max_allowed = monitors_config->max_allowed;
> spice_marshall_msg_display_monitors_config(base_marshaller, msg);
> free(msg);
> }
>
> -static void red_marshall_stream_activate_report(RedChannelClient *rcc,
> +static void marshall_stream_activate_report(RedChannelClient *rcc,
> SpiceMarshaller
> *base_marshaller,
> uint32_t stream_id)
> {
> DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
> StreamAgent *agent = &dcc->stream_agents[stream_id];
> SpiceMsgDisplayStreamActivateReport msg;
>
> red_channel_client_init_send_data(rcc,
> SPICE_MSG_DISPLAY_STREAM_ACTIVATE_REPORT, NULL);
> msg.stream_id = stream_id;
> msg.unique_id = agent->report_id;
> msg.max_window_size = RED_STREAM_CLIENT_REPORT_WINDOW;
> msg.timeout_ms = RED_STREAM_CLIENT_REPORT_TIMEOUT;
> spice_marshall_msg_display_stream_activate_report(base_marshaller,
> &msg);
> }
>
> -static inline void display_begin_send_message(RedChannelClient *rcc)
> +static void begin_send_message(RedChannelClient *rcc)
> {
> DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
> FreeList *free_list = &dcc->send_data.free_list;
>
> if (free_list->res->count) {
> int sync_count = 0;
> int i;
>
> for (i = 0; i < MAX_CACHE_CLIENTS; i++) {
> if (i != dcc->common.id && free_list->sync[i] != 0) {
> free_list->wait.header.wait_list[sync_count].channel_type =
> SPICE_CHANNEL_DISPLAY;
> free_list->wait.header.wait_list[sync_count].channel_id = i;
> free_list->wait.header.wait_list[sync_count++].message_serial
> = free_list->sync[i];
> }
> }
> free_list->wait.header.wait_count = sync_count;
>
> if (rcc->is_mini_header) {
> - display_channel_send_free_list(rcc);
> + send_free_list(rcc);
> } else {
> - display_channel_send_free_list_legacy(rcc);
> + send_free_list_legacy(rcc);
> }
> }
> red_channel_client_begin_send_message(rcc);
> }
>
> static void reset_send_data(DisplayChannelClient *dcc)
> {
> dcc->send_data.free_list.res->count = 0;
> dcc->send_data.num_pixmap_cache_items = 0;
> memset(dcc->send_data.free_list.sync, 0,
> sizeof(dcc->send_data.free_list.sync));
> @@ -2783,39 +2784,39 @@
> SpiceMarshaller *m = red_channel_client_get_marshaller(rcc);
>
> reset_send_data(dcc);
> switch (pipe_item->type) {
> case PIPE_ITEM_TYPE_DRAW: {
> DrawablePipeItem *dpi = SPICE_CONTAINEROF(pipe_item,
> DrawablePipeItem, dpi_pipe_item);
> marshall_qxl_drawable(rcc, m, dpi);
> break;
> }
> case PIPE_ITEM_TYPE_INVAL_ONE:
> - red_marshall_inval_palette(rcc, m, (CacheItem *)pipe_item);
> + marshall_inval_palette(rcc, m, (CacheItem *)pipe_item);
> break;
> case PIPE_ITEM_TYPE_STREAM_CREATE: {
> StreamAgent *agent = SPICE_CONTAINEROF(pipe_item, StreamAgent,
> create_item);
> - red_display_marshall_stream_start(rcc, m, agent);
> + marshall_stream_start(rcc, m, agent);
> break;
> }
> case PIPE_ITEM_TYPE_STREAM_CLIP: {
> StreamClipItem* clip_item = (StreamClipItem *)pipe_item;
> - red_display_marshall_stream_clip(rcc, m, clip_item);
> + marshall_stream_clip(rcc, m, clip_item);
> break;
> }
> case PIPE_ITEM_TYPE_STREAM_DESTROY: {
> StreamAgent *agent = SPICE_CONTAINEROF(pipe_item, StreamAgent,
> destroy_item);
> - red_display_marshall_stream_end(rcc, m, agent);
> + marshall_stream_end(rcc, m, agent);
> break;
> }
> case PIPE_ITEM_TYPE_UPGRADE:
> - red_display_marshall_upgrade(rcc, m, (UpgradeItem *)pipe_item);
> + marshall_upgrade(rcc, m, (UpgradeItem *)pipe_item);
> break;
> case PIPE_ITEM_TYPE_VERB:
> red_marshall_verb(rcc, (VerbItem*)pipe_item);
> break;
> case PIPE_ITEM_TYPE_MIGRATE_DATA:
> display_channel_marshall_migrate_data(rcc, m);
> break;
> case PIPE_ITEM_TYPE_IMAGE:
> red_marshall_image(rcc, m, (ImageItem *)pipe_item);
> break;
> @@ -2825,51 +2826,51 @@
> case PIPE_ITEM_TYPE_PIXMAP_RESET:
> display_channel_marshall_reset_cache(rcc, m);
> break;
> case PIPE_ITEM_TYPE_INVAL_PALETTE_CACHE:
> dcc_palette_cache_reset(dcc);
> red_channel_client_init_send_data(rcc,
> SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES, NULL);
> break;
> case PIPE_ITEM_TYPE_CREATE_SURFACE: {
> SurfaceCreateItem *surface_create = SPICE_CONTAINEROF(pipe_item,
> SurfaceCreateItem,
> pipe_item);
> - red_marshall_surface_create(rcc, m,
> &surface_create->surface_create);
> + marshall_surface_create(rcc, m, &surface_create->surface_create);
> break;
> }
> case PIPE_ITEM_TYPE_DESTROY_SURFACE: {
> SurfaceDestroyItem *surface_destroy = SPICE_CONTAINEROF(pipe_item,
> SurfaceDestroyItem,
> pipe_item);
> - red_marshall_surface_destroy(rcc, m,
> surface_destroy->surface_destroy.surface_id);
> + marshall_surface_destroy(rcc, m,
> surface_destroy->surface_destroy.surface_id);
> break;
> }
> case PIPE_ITEM_TYPE_MONITORS_CONFIG: {
> MonitorsConfigItem *monconf_item = SPICE_CONTAINEROF(pipe_item,
> MonitorsConfigItem,
> pipe_item);
> - red_marshall_monitors_config(rcc, m, monconf_item->monitors_config);
> + marshall_monitors_config(rcc, m, monconf_item->monitors_config);
> break;
> }
> case PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT: {
> StreamActivateReportItem *report_item = SPICE_CONTAINEROF(pipe_item,
> StreamActivateReportItem,
> pipe_item);
> - red_marshall_stream_activate_report(rcc, m, report_item->stream_id);
> + marshall_stream_activate_report(rcc, m, report_item->stream_id);
> break;
> }
> default:
> - spice_error("invalid pipe item type");
> + spice_warn_if_reached();
> }
>
> dcc_release_item(dcc, pipe_item, FALSE);
>
> // a message is pending
> if (red_channel_client_send_message_pending(rcc)) {
> - display_begin_send_message(rcc);
> + begin_send_message(rcc);
> }
> }
> /* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> /*
> Copyright (C) 2009 Red Hat, Inc.
>
> This library is free software; you can redistribute it and/or
> modify it under the terms of the GNU Lesser General Public
> License as published by the Free Software Foundation; either
> version 2.1 of the License, or (at your option) any later version.
> @@ -2910,25 +2911,23 @@
> #include <poll.h>
> #include <pthread.h>
> #include <netinet/tcp.h>
> #include <openssl/ssl.h>
> #include <inttypes.h>
> #include <glib.h>
>
> #include <spice/protocol.h>
> #include <spice/qxl_dev.h>
> #include "common/lz.h"
> -#include "common/marshaller.h"
> #include "common/rect.h"
> #include "common/region.h"
> #include "common/ring.h"
> -#include "common/generated_server_marshallers.h"
>
> #include "display-channel.h"
> #include "stream.h"
>
> #include "spice.h"
> #include "red_worker.h"
> #include "spice_timer_queue.h"
> #include "cursor-channel.h"
> #include "tree.h"
>
> @@ -2941,22 +2940,20 @@
>
> #define MAX_EVENT_SOURCES 20
> #define INF_EVENT_WAIT ~0
>
> struct SpiceWatch {
> struct RedWorker *worker;
> SpiceWatchFunc watch_func;
> void *watch_func_opaque;
> };
>
> -#define MAX_PIPE_SIZE 50
> -
> struct RedWorker {
> pthread_t thread;
> clockid_t clockid;
> QXLInstance *qxl;
> RedDispatcher *red_dispatcher;
> int running;
> struct pollfd poll_fds[MAX_EVENT_SOURCES];
> struct SpiceWatch watches[MAX_EVENT_SOURCES];
> unsigned int event_timeout;
>
> @@ -2977,29 +2974,34 @@
> StatNodeRef stat;
> uint64_t *wakeup_counter;
> uint64_t *command_counter;
> #endif
>
> int driver_cap_monitors_config;
>
> FILE *record_fd;
> };
>
> -static inline void display_begin_send_message(RedChannelClient *rcc);
> -
> QXLInstance* red_worker_get_qxl(RedWorker *worker)
> {
> spice_return_val_if_fail(worker != NULL, NULL);
>
> return worker->qxl;
> }
>
> +RedMemSlotInfo* red_worker_get_memslot(RedWorker *worker)
> +{
> + spice_return_val_if_fail(worker != NULL, NULL);
> +
> + return &worker->mem_slots;
> +}
> +
> static int display_is_connected(RedWorker *worker)
> {
> return (worker->display_channel && red_channel_is_connected(
> &worker->display_channel->common.base));
> }
>
> static int cursor_is_connected(RedWorker *worker)
> {
> return worker->cursor_channel &&
> red_channel_is_connected(RED_CHANNEL(worker->cursor_channel));
> @@ -5085,20 +5087,22 @@
> red_pipe_add_verb(rcc, verb);
> }
> }
>
> RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher);
> bool red_worker_run(RedWorker *worker);
> QXLInstance* red_worker_get_qxl(RedWorker *worker);
> RedChannel* red_worker_get_cursor_channel(RedWorker *worker);
> RedChannel* red_worker_get_display_channel(RedWorker *worker);
> clockid_t red_worker_get_clockid(RedWorker *worker);
> +RedMemSlotInfo* red_worker_get_memslot(RedWorker *worker);
> +
> void red_drawable_unref(RedWorker *worker, RedDrawable *red_drawable,
> uint32_t group_id);
>
> RedChannel *red_worker_new_channel(RedWorker *worker, int size,
> const char *name,
> uint32_t channel_type, int
> migration_flags,
> ChannelCbs *channel_cbs,
> channel_handle_parsed_proc
> handle_parsed);
>
> CommonChannelClient *common_channel_new_client(CommonChannel *common,
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
Frediano
More information about the Spice-devel
mailing list