> > > > > 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@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/spice-devel > Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel