summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2010-11-07 18:51:03 +0200
committerAlon Levy <alevy@redhat.com>2011-02-11 15:32:21 +0200
commit7d53a51da0943c71f190c64bf629b4b3f0d27e03 (patch)
treee1b9b5b4a802367f9191866e522f2dcf3078ce50 /server
parent859aa15806b23bbf31c8f342c65b7e4c70a6119b (diff)
downloadspice-7d53a51da0943c71f190c64bf629b4b3f0d27e03.tar.gz
spice-7d53a51da0943c71f190c64bf629b4b3f0d27e03.tar.xz
spice-7d53a51da0943c71f190c64bf629b4b3f0d27e03.zip
server/red_worker: add red_channel_init_send_data
Changes semantics of send to always hold/release regardless of block, like red_channel. A hold is just a reference count increment or nop.
Diffstat (limited to 'server')
-rw-r--r--server/red_worker.c171
1 files changed, 84 insertions, 87 deletions
diff --git a/server/red_worker.c b/server/red_worker.c
index 6765d0f2..f3062035 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -976,8 +976,8 @@ static void red_display_release_stream(DisplayChannel *display, StreamAgent *age
static inline void red_detach_stream(RedWorker *worker, Stream *stream);
static void red_stop_stream(RedWorker *worker, Stream *stream);
static inline void red_stream_maintenance(RedWorker *worker, Drawable *candidate, Drawable *sect);
-static inline void red_begin_send_message(RedChannel *channel, void *item);
-static inline void display_begin_send_message(DisplayChannel *channel, void *item);
+static inline void red_begin_send_message(RedChannel *channel);
+static inline void display_begin_send_message(DisplayChannel *channel);
static void red_receive(RedChannel *channel);
static void red_release_pixmap_cache(DisplayChannel *channel);
static void red_release_glz(DisplayChannel *channel);
@@ -1176,6 +1176,16 @@ static void show_draw_item(RedWorker *worker, DrawItem *draw_item, const char *p
draw_item->base.rgn.extents.y2);
}
+static void red_channel_init_send_data(RedChannel *channel, uint16_t type, PipeItem *item)
+{
+ if (item) {
+ channel->hold_item(item);
+ ASSERT(channel->send_data.item == NULL);
+ channel->send_data.item = item;
+ }
+ channel->send_data.header->type = type;
+}
+
static inline void red_pipe_item_init(PipeItem *item, int type)
{
ring_item_init(&item->link);
@@ -6449,9 +6459,8 @@ static void red_send_qxl_draw_fill(RedWorker *worker,
SpiceMarshaller *mask_bitmap_out;
SpiceFill fill;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_DRAW_FILL, &item->pipe_item);
fill_base(display_channel, item);
-
- channel->send_data.header->type = SPICE_MSG_DISPLAY_DRAW_FILL;
fill = drawable->u.fill;
spice_marshall_Fill(channel->send_data.marshaller,
&fill,
@@ -6498,7 +6507,7 @@ static void red_lossy_send_qxl_draw_fill(RedWorker *worker,
red_send_qxl_draw_fill(worker, display_channel, item);
- // eitehr the brush operation is opaque, or the dest is not lossy
+ // either the brush operation is opaque, or the dest is not lossy
surface_lossy_region_update(worker, display_channel, item, has_mask, FALSE);
} else {
int resend_surface_ids[2];
@@ -6534,9 +6543,8 @@ static FillBitsType red_send_qxl_draw_opaque(RedWorker *worker,
SpiceOpaque opaque;
FillBitsType src_send_type;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_DRAW_OPAQUE, &item->pipe_item);
fill_base(display_channel, item);
-
- channel->send_data.header->type = SPICE_MSG_DISPLAY_DRAW_OPAQUE;
opaque = drawable->u.opaque;
spice_marshall_Opaque(channel->send_data.marshaller,
&opaque,
@@ -6630,10 +6638,8 @@ static FillBitsType red_send_qxl_draw_copy(RedWorker *worker,
SpiceCopy copy;
FillBitsType src_send_type;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_DRAW_COPY, &item->pipe_item);
fill_base(display_channel, item);
-
- channel->send_data.header->type = SPICE_MSG_DISPLAY_DRAW_COPY;
-
copy = drawable->u.copy;
spice_marshall_Copy(channel->send_data.marshaller,
&copy,
@@ -6680,8 +6686,8 @@ static void red_send_qxl_draw_transparent(RedWorker *worker,
SpiceMarshaller *src_bitmap_out;
SpiceTransparent transparent;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_DRAW_TRANSPARENT, &item->pipe_item);
fill_base(display_channel, item);
- channel->send_data.header->type = SPICE_MSG_DISPLAY_DRAW_TRANSPARENT;
transparent = drawable->u.transparent;
spice_marshall_Transparent(channel->send_data.marshaller,
&transparent,
@@ -6727,8 +6733,8 @@ static FillBitsType red_send_qxl_draw_alpha_blend(RedWorker *worker,
SpiceAlphaBlend alpha_blend;
FillBitsType src_send_type;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND, &item->pipe_item);
fill_base(display_channel, item);
- channel->send_data.header->type = SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND;
alpha_blend = drawable->u.alpha_blend;
spice_marshall_AlphaBlend(channel->send_data.marshaller,
&alpha_blend,
@@ -6771,8 +6777,8 @@ static void red_send_qxl_copy_bits(RedWorker *worker,
RedDrawable *drawable = item->red_drawable;
SpicePoint copy_bits;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_COPY_BITS, &item->pipe_item);
fill_base(display_channel, item);
- channel->send_data.header->type = SPICE_MSG_DISPLAY_COPY_BITS;
copy_bits = drawable->u.copy_bits.src_pos;
spice_marshall_Point(channel->send_data.marshaller,
&copy_bits);
@@ -6816,8 +6822,8 @@ static void red_send_qxl_draw_blend(RedWorker *worker,
SpiceMarshaller *mask_bitmap_out;
SpiceBlend blend;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_DRAW_BLEND, &item->pipe_item);
fill_base(display_channel, item);
- channel->send_data.header->type = SPICE_MSG_DISPLAY_DRAW_BLEND;
blend = drawable->u.blend;
spice_marshall_Blend(channel->send_data.marshaller,
&blend,
@@ -6878,8 +6884,8 @@ static void red_send_qxl_draw_blackness(RedWorker *worker,
SpiceMarshaller *mask_bitmap_out;
SpiceBlackness blackness;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_DRAW_BLACKNESS, &item->pipe_item);
fill_base(display_channel, item);
- channel->send_data.header->type = SPICE_MSG_DISPLAY_DRAW_BLACKNESS;
blackness = drawable->u.blackness;
spice_marshall_Blackness(channel->send_data.marshaller,
@@ -6910,8 +6916,8 @@ static void red_send_qxl_draw_whiteness(RedWorker *worker,
SpiceMarshaller *mask_bitmap_out;
SpiceWhiteness whiteness;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_DRAW_WHITENESS, &item->pipe_item);
fill_base(display_channel, item);
- channel->send_data.header->type = SPICE_MSG_DISPLAY_DRAW_WHITENESS;
whiteness = drawable->u.whiteness;
spice_marshall_Whiteness(channel->send_data.marshaller,
@@ -6942,8 +6948,8 @@ static void red_send_qxl_draw_inverse(RedWorker *worker,
RedChannel *channel = &display_channel->common.base;
SpiceInvers inverse;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_DRAW_INVERS, NULL);
fill_base(display_channel, item);
- channel->send_data.header->type = SPICE_MSG_DISPLAY_DRAW_INVERS;
inverse = drawable->u.invers;
spice_marshall_Invers(channel->send_data.marshaller,
@@ -6971,8 +6977,8 @@ static void red_send_qxl_draw_rop3(RedWorker *worker,
SpiceMarshaller *brush_pat_out;
SpiceMarshaller *mask_bitmap_out;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_DRAW_ROP3, &item->pipe_item);
fill_base(display_channel, item);
- channel->send_data.header->type = SPICE_MSG_DISPLAY_DRAW_ROP3;
rop3 = drawable->u.rop3;
spice_marshall_Rop3(channel->send_data.marshaller,
&rop3,
@@ -7052,9 +7058,8 @@ static void red_send_qxl_draw_stroke(RedWorker *worker,
SpiceMarshaller *brush_pat_out;
SpiceMarshaller *style_out;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_DRAW_STROKE, &item->pipe_item);
fill_base(display_channel, item);
-
- channel->send_data.header->type = SPICE_MSG_DISPLAY_DRAW_STROKE;
stroke = drawable->u.stroke;
spice_marshall_Stroke(channel->send_data.marshaller,
&stroke,
@@ -7131,9 +7136,8 @@ static void red_send_qxl_draw_text(RedWorker *worker,
SpiceMarshaller *brush_pat_out;
SpiceMarshaller *back_brush_pat_out;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_DRAW_TEXT, &item->pipe_item);
fill_base(display_channel, item);
-
- channel->send_data.header->type = SPICE_MSG_DISPLAY_DRAW_TEXT;
text = drawable->u.text;
spice_marshall_Text(channel->send_data.marshaller,
&text,
@@ -7262,7 +7266,7 @@ static void red_lossy_send_qxl_drawable(RedWorker *worker, DisplayChannel *displ
// a message is pending
if (display_channel->common.base.send_data.header->type != 0) {
- display_begin_send_message(display_channel, &item->pipe_item);
+ display_begin_send_message(display_channel);
}
}
@@ -7314,7 +7318,7 @@ static inline void red_send_qxl_drawable(RedWorker *worker, DisplayChannel *disp
default:
red_error("invalid type");
}
- display_begin_send_message(display_channel, &item->pipe_item);
+ display_begin_send_message(display_channel);
}
#define MAX_SEND_VEC 100
@@ -7328,7 +7332,7 @@ static void inline channel_release_res(RedChannel *channel)
channel->send_data.item = NULL;
}
-static void red_send_data(RedChannel *channel, void *item)
+static void red_send_data(RedChannel *channel)
{
for (;;) {
uint32_t n = channel->send_data.size - channel->send_data.pos;
@@ -7350,10 +7354,6 @@ static void red_send_data(RedChannel *channel, void *item)
switch (errno) {
case EAGAIN:
channel->send_data.blocked = TRUE;
- if (item) {
- channel->hold_item(item);
- channel->send_data.item = item;
- }
return;
case EINTR:
break;
@@ -7396,17 +7396,17 @@ static void display_channel_push_release(DisplayChannel *channel, uint8_t type,
free_list->res->resources[free_list->res->count++].id = id;
}
-static inline void red_begin_send_message(RedChannel *channel, void *item)
+static inline void red_begin_send_message(RedChannel *channel)
{
spice_marshaller_flush(channel->send_data.marshaller);
channel->send_data.size = spice_marshaller_get_total_size(channel->send_data.marshaller);
channel->send_data.header->size = channel->send_data.size - sizeof(SpiceDataHeader);
channel->ack_data.messages_window++;
channel->send_data.header = NULL; /* avoid writing to this until we have a new message */
- red_send_data(channel, item);
+ red_send_data(channel);
}
-static inline void display_begin_send_message(DisplayChannel *channel, void *item)
+static inline void display_begin_send_message(DisplayChannel *channel)
{
FreeList *free_list = &channel->send_data.free_list;
@@ -7453,7 +7453,7 @@ static inline void display_begin_send_message(DisplayChannel *channel, void *ite
spice_marshaller_add_uint32(sub_list_m, spice_marshaller_get_offset(inval_m));
channel->common.base.send_data.header->sub_list = spice_marshaller_get_offset(sub_list_m);
}
- red_begin_send_message((RedChannel *)channel, item);
+ red_begin_send_message((RedChannel *)channel);
}
static inline RedChannel *red_ref_channel(RedChannel *channel)
@@ -7729,7 +7729,7 @@ static inline int red_send_stream_data(DisplayChannel *display_channel, Drawable
red_display_share_stream_buf(display_channel);
}
- channel->send_data.header->type = SPICE_MSG_DISPLAY_STREAM_DATA;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_STREAM_DATA, NULL);
SpiceMsgDisplayStreamData stream_data;
@@ -7740,7 +7740,7 @@ static inline int red_send_stream_data(DisplayChannel *display_channel, Drawable
spice_marshaller_add_ref(channel->send_data.marshaller,
display_channel->send_data.stream_outbuf, n);
- display_begin_send_message(display_channel, NULL);
+ display_begin_send_message(display_channel);
agent->lats_send_time = time_now;
return TRUE;
}
@@ -7762,35 +7762,35 @@ static void red_send_set_ack(RedChannel *channel)
SpiceMsgSetAck ack;
ASSERT(channel);
- channel->send_data.header->type = SPICE_MSG_SET_ACK;
+ red_channel_init_send_data(channel, SPICE_MSG_SET_ACK, NULL);
ack.generation = ++channel->ack_data.generation;
ack.window = channel->ack_data.client_window;
channel->ack_data.messages_window = 0;
spice_marshall_msg_set_ack(channel->send_data.marshaller, &ack);
- red_begin_send_message(channel, NULL);
+ red_begin_send_message(channel);
}
static inline void red_send_verb(RedChannel *channel, uint16_t verb)
{
ASSERT(channel);
- channel->send_data.header->type = verb;
- red_begin_send_message(channel, NULL);
+ red_channel_init_send_data(channel, verb, NULL);
+ red_begin_send_message(channel);
}
static inline void display_send_verb(DisplayChannel *channel, uint16_t verb)
{
ASSERT(channel);
- channel->common.base.send_data.header->type = verb;
- display_begin_send_message(channel, NULL);
+ red_channel_init_send_data(&channel->common.base, verb, NULL);
+ display_begin_send_message(channel);
}
static inline void __red_send_inval(RedChannel *channel, CacheItem *cach_item)
{
SpiceMsgDisplayInvalOne inval_one;
- channel->send_data.header->type = cach_item->inval_type;
+ red_channel_init_send_data(channel, cach_item->inval_type, NULL);
inval_one.id = *(uint64_t *)&cach_item->id;
spice_marshall_msg_cursor_inval_one(channel->send_data.marshaller, &inval_one);
@@ -7799,31 +7799,31 @@ static inline void __red_send_inval(RedChannel *channel, CacheItem *cach_item)
static void red_send_inval(RedChannel *channel, CacheItem *cach_item)
{
__red_send_inval(channel, cach_item);
- red_begin_send_message(channel, NULL);
+ red_begin_send_message(channel);
}
static void red_display_send_inval(DisplayChannel *display_channel, CacheItem *cach_item)
{
__red_send_inval((RedChannel *)display_channel, cach_item);
- display_begin_send_message(display_channel, NULL);
+ display_begin_send_message(display_channel);
}
static void display_channel_send_migrate(DisplayChannel *display_channel)
{
SpiceMsgMigrate migrate;
- display_channel->common.base.send_data.header->type = SPICE_MSG_MIGRATE;
+ red_channel_init_send_data(&display_channel->common.base, SPICE_MSG_MIGRATE, NULL);
migrate.flags = SPICE_MIGRATE_NEED_FLUSH | SPICE_MIGRATE_NEED_DATA_TRANSFER;
spice_marshall_msg_migrate(display_channel->common.base.send_data.marshaller, &migrate);
display_channel->expect_migrate_mark = TRUE;
- display_begin_send_message(display_channel, NULL);
+ display_begin_send_message(display_channel);
}
static void display_channel_send_migrate_data(DisplayChannel *display_channel)
{
DisplayChannelMigrateData display_data;
- display_channel->common.base.send_data.header->type = SPICE_MSG_MIGRATE_DATA;
+ red_channel_init_send_data(&display_channel->common.base, SPICE_MSG_MIGRATE_DATA, NULL);
ASSERT(display_channel->pixmap_cache);
display_data.magic = DISPLAY_MIGRATE_DATA_MAGIC;
@@ -7847,7 +7847,7 @@ static void display_channel_send_migrate_data(DisplayChannel *display_channel)
spice_marshaller_add_ref(display_channel->common.base.send_data.marshaller,
(uint8_t *)&display_data, sizeof(display_data));
- display_begin_send_message(display_channel, NULL);
+ display_begin_send_message(display_channel);
}
static void display_channel_pixmap_sync(DisplayChannel *display_channel)
@@ -7856,7 +7856,7 @@ static void display_channel_pixmap_sync(DisplayChannel *display_channel)
PixmapCache *pixmap_cache;
- display_channel->common.base.send_data.header->type = SPICE_MSG_WAIT_FOR_CHANNELS;
+ red_channel_init_send_data(&display_channel->common.base, SPICE_MSG_WAIT_FOR_CHANNELS, NULL);
pixmap_cache = display_channel->pixmap_cache;
@@ -7873,19 +7873,19 @@ static void display_channel_pixmap_sync(DisplayChannel *display_channel)
spice_marshall_msg_wait_for_channels(display_channel->common.base.send_data.marshaller, &wait);
- display_begin_send_message(display_channel, NULL);
+ display_begin_send_message(display_channel);
}
static void display_channel_reset_cache(DisplayChannel *display_channel)
{
SpiceMsgWaitForChannels wait;
- display_channel->common.base.send_data.header->type = SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS;
+ red_channel_init_send_data(&display_channel->common.base, SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS, NULL);
pixmap_cache_reset(display_channel->pixmap_cache, display_channel, &wait);
spice_marshall_msg_display_inval_all_pixmaps(display_channel->common.base.send_data.marshaller,
&wait);
- display_begin_send_message(display_channel, NULL);
+ display_begin_send_message(display_channel);
}
static void red_send_image(DisplayChannel *display_channel, ImageItem *item)
@@ -7928,7 +7928,7 @@ static void red_send_image(DisplayChannel *display_channel, ImageItem *item)
chunks = spice_chunks_new_linear(item->data, bitmap.stride * bitmap.y);
bitmap.data = chunks;
- channel->send_data.header->type = SPICE_MSG_DISPLAY_DRAW_COPY;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_DRAW_COPY, &item->link);
copy.base.surface_id = item->surface_id;
copy.base.box.left = item->pos.x;
@@ -8021,7 +8021,7 @@ static void red_send_image(DisplayChannel *display_channel, ImageItem *item)
bitmap.y * bitmap.stride);
region_remove(surface_lossy_region, &copy.base.box);
}
- display_begin_send_message(display_channel, &item->link);
+ display_begin_send_message(display_channel);
spice_chunks_destroy(chunks);
}
@@ -8036,7 +8036,7 @@ static void red_display_send_upgrade(DisplayChannel *display_channel, UpgradeIte
ASSERT(display_channel && item && item->drawable);
channel = &display_channel->common.base;
- channel->send_data.header->type = SPICE_MSG_DISPLAY_DRAW_COPY;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_DRAW_COPY, &item->base);
red_drawable = item->drawable->red_drawable;
ASSERT(red_drawable->type == QXL_DRAW_COPY);
@@ -8056,7 +8056,7 @@ static void red_display_send_upgrade(DisplayChannel *display_channel, UpgradeIte
fill_bits(display_channel, src_bitmap_out, copy.data.src_bitmap, item->drawable, FALSE);
- display_begin_send_message(display_channel, &item->base);
+ display_begin_send_message(display_channel);
}
static void red_display_send_stream_start(DisplayChannel *display_channel, StreamAgent *agent)
@@ -8066,7 +8066,8 @@ static void red_display_send_stream_start(DisplayChannel *display_channel, Strea
agent->lats_send_time = 0;
ASSERT(stream);
- channel->send_data.header->type = SPICE_MSG_DISPLAY_STREAM_CREATE;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_STREAM_CREATE,
+ stream->current ? &stream->current->pipe_item : NULL);
SpiceMsgDisplayStreamCreate stream_create;
SpiceClipRects clip_rects;
@@ -8093,11 +8094,7 @@ static void red_display_send_stream_start(DisplayChannel *display_channel, Strea
spice_marshall_msg_display_stream_create(channel->send_data.marshaller, &stream_create);
- if (stream->current) {
- display_begin_send_message(display_channel, &stream->current->pipe_item);
- } else {
- display_begin_send_message(display_channel, NULL);
- }
+ display_begin_send_message(display_channel);
}
static void red_display_send_stream_clip(DisplayChannel *display_channel,
@@ -8110,7 +8107,7 @@ static void red_display_send_stream_clip(DisplayChannel *display_channel,
ASSERT(stream);
- channel->send_data.header->type = SPICE_MSG_DISPLAY_STREAM_CLIP;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_STREAM_CLIP, &item->base);
SpiceMsgDisplayStreamClip stream_clip;
stream_clip.id = agent - display_channel->stream_agents;
@@ -8119,7 +8116,7 @@ static void red_display_send_stream_clip(DisplayChannel *display_channel,
spice_marshall_msg_display_stream_clip(channel->send_data.marshaller, &stream_clip);
- display_begin_send_message(display_channel, item);
+ display_begin_send_message(display_channel);
}
static void red_display_send_stream_end(DisplayChannel *display_channel, StreamAgent* agent)
@@ -8127,12 +8124,12 @@ static void red_display_send_stream_end(DisplayChannel *display_channel, StreamA
RedChannel *channel = &display_channel->common.base;
SpiceMsgDisplayStreamDestroy destroy;
- channel->send_data.header->type = SPICE_MSG_DISPLAY_STREAM_DESTROY;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_STREAM_DESTROY, NULL);
destroy.id = agent - display_channel->stream_agents;
spice_marshall_msg_display_stream_destroy(channel->send_data.marshaller, &destroy);
- display_begin_send_message(display_channel, NULL);
+ display_begin_send_message(display_channel);
}
static void red_cursor_send_inval(CursorChannel *channel, CacheItem *cach_item)
@@ -8151,7 +8148,7 @@ static void red_send_cursor_init(CursorChannel *channel)
worker = channel->common.worker;
- channel->common.base.send_data.header->type = SPICE_MSG_CURSOR_INIT;
+ red_channel_init_send_data(&channel->common.base, SPICE_MSG_CURSOR_INIT, &worker->cursor->pipe_data);
msg.visible = worker->cursor_visible;
msg.position = worker->cursor_position;
msg.trail_length = worker->cursor_trail_length;
@@ -8161,7 +8158,7 @@ static void red_send_cursor_init(CursorChannel *channel)
spice_marshall_msg_cursor_init(channel->common.base.send_data.marshaller, &msg);
add_buf_from_info(&channel->common.base, channel->common.base.send_data.marshaller, &info);
- red_begin_send_message(&channel->common.base, worker->cursor);
+ red_begin_send_message(&channel->common.base);
}
static void red_send_local_cursor(CursorChannel *cursor_channel, LocalCursor *cursor)
@@ -8174,7 +8171,7 @@ static void red_send_local_cursor(CursorChannel *cursor_channel, LocalCursor *cu
ASSERT(cursor_channel);
worker = cursor_channel->common.worker;
channel = &cursor_channel->common.base;
- channel->send_data.header->type = SPICE_MSG_CURSOR_SET;
+ red_channel_init_send_data(channel, SPICE_MSG_CURSOR_SET, &cursor->base.pipe_data);
cursor_set.position = cursor->position;
cursor_set.visible = worker->cursor_visible;
@@ -8182,7 +8179,7 @@ static void red_send_local_cursor(CursorChannel *cursor_channel, LocalCursor *cu
spice_marshall_msg_cursor_set(channel->send_data.marshaller, &cursor_set);
add_buf_from_info(channel, channel->send_data.marshaller, &info);
- red_begin_send_message(channel, cursor);
+ red_begin_send_message(channel);
red_release_cursor(worker, (CursorItem *)cursor);
}
@@ -8191,11 +8188,11 @@ static void cursor_channel_send_migrate(CursorChannel *cursor_channel)
{
SpiceMsgMigrate migrate;
- cursor_channel->common.base.send_data.header->type = SPICE_MSG_MIGRATE;
+ red_channel_init_send_data(&cursor_channel->common.base, SPICE_MSG_MIGRATE, NULL);
migrate.flags = 0;
spice_marshall_msg_migrate(cursor_channel->common.base.send_data.marshaller, &migrate);
- red_begin_send_message((RedChannel*)cursor_channel, NULL);
+ red_begin_send_message((RedChannel*)cursor_channel);
}
static void red_send_cursor(CursorChannel *cursor_channel, CursorItem *cursor)
@@ -8216,7 +8213,7 @@ static void red_send_cursor(CursorChannel *cursor_channel, CursorItem *cursor)
case QXL_CURSOR_MOVE:
{
SpiceMsgCursorMove cursor_move;
- channel->send_data.header->type = SPICE_MSG_CURSOR_MOVE;
+ red_channel_init_send_data(channel, SPICE_MSG_CURSOR_MOVE, &cursor->pipe_data);
cursor_move.position = cmd->u.position;
spice_marshall_msg_cursor_move(m, &cursor_move);
break;
@@ -8226,7 +8223,7 @@ static void red_send_cursor(CursorChannel *cursor_channel, CursorItem *cursor)
SpiceMsgCursorSet cursor_set;
AddBufInfo info;
- channel->send_data.header->type = SPICE_MSG_CURSOR_SET;
+ red_channel_init_send_data(channel, SPICE_MSG_CURSOR_SET, &cursor->pipe_data);
cursor_set.position = cmd->u.set.position;
cursor_set.visible = worker->cursor_visible;
@@ -8236,13 +8233,13 @@ static void red_send_cursor(CursorChannel *cursor_channel, CursorItem *cursor)
break;
}
case QXL_CURSOR_HIDE:
- channel->send_data.header->type = SPICE_MSG_CURSOR_HIDE;
+ red_channel_init_send_data(channel, SPICE_MSG_CURSOR_HIDE, &cursor->pipe_data);
break;
case QXL_CURSOR_TRAIL:
{
SpiceMsgCursorTrail cursor_trail;
- channel->send_data.header->type = SPICE_MSG_CURSOR_TRAIL;
+ red_channel_init_send_data(channel, SPICE_MSG_CURSOR_TRAIL, &cursor->pipe_data);
cursor_trail.length = cmd->u.trail.length;
cursor_trail.frequency = cmd->u.trail.frequency;
spice_marshall_msg_cursor_trail(m, &cursor_trail);
@@ -8252,7 +8249,7 @@ static void red_send_cursor(CursorChannel *cursor_channel, CursorItem *cursor)
red_error("bad cursor command %d", cmd->type);
}
- red_begin_send_message(channel, cursor);
+ red_begin_send_message(channel);
red_release_cursor(cursor_channel->common.worker, cursor);
}
@@ -8265,11 +8262,11 @@ static void red_send_surface_create(DisplayChannel *display, SpiceMsgSurfaceCrea
channel = &display->common.base;
region_init(&display->surface_client_lossy_region[surface_create->surface_id]);
- channel->send_data.header->type = SPICE_MSG_DISPLAY_SURFACE_CREATE;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_SURFACE_CREATE, NULL);
spice_marshall_msg_display_surface_create(channel->send_data.marshaller, surface_create);
- red_begin_send_message(channel, NULL);
+ red_begin_send_message(channel);
}
static void red_send_surface_destroy(DisplayChannel *display, uint32_t surface_id)
@@ -8281,13 +8278,13 @@ static void red_send_surface_destroy(DisplayChannel *display, uint32_t surface_i
channel = &display->common.base;
region_destroy(&display->surface_client_lossy_region[surface_id]);
- channel->send_data.header->type = SPICE_MSG_DISPLAY_SURFACE_DESTROY;
+ red_channel_init_send_data(channel, SPICE_MSG_DISPLAY_SURFACE_DESTROY, NULL);
surface_destroy.surface_id = surface_id;
spice_marshall_msg_display_surface_destroy(channel->send_data.marshaller, &surface_destroy);
- red_begin_send_message(channel, NULL);
+ red_begin_send_message(channel);
}
static inline PipeItem *red_pipe_get(RedChannel *channel)
@@ -8810,7 +8807,7 @@ static inline void flush_display_commands(RedWorker *worker)
RedChannel *channel = (RedChannel *)worker->display_channel;
red_ref_channel(channel);
red_receive(channel);
- red_send_data(channel, NULL);
+ red_send_data(channel);
if (red_now() >= end_time) {
red_printf("update timeout");
red_disconnect_display(channel);
@@ -8852,7 +8849,7 @@ static inline void flush_cursor_commands(RedWorker *worker)
RedChannel *channel = (RedChannel *)worker->cursor_channel;
red_ref_channel(channel);
red_receive(channel);
- red_send_data(channel, NULL);
+ red_send_data(channel);
if (red_now() >= end_time) {
red_printf("flush cursor timeout");
red_disconnect_cursor(channel);
@@ -9429,7 +9426,7 @@ static void handle_channel_events(EventListener *in_listener, uint32_t events)
}
if (channel->send_data.blocked) {
- red_send_data(channel, NULL);
+ red_send_data(channel);
}
}
@@ -9702,7 +9699,7 @@ static void red_wait_outgoing_item(RedChannel *channel)
do {
usleep(DETACH_SLEEP_DURATION);
red_receive(channel);
- red_send_data(channel, NULL);
+ red_send_data(channel);
} while ((blocked = channel->send_data.blocked) && red_now() < end_time);
if (blocked) {
@@ -9731,7 +9728,7 @@ static void red_wait_pipe_item_sent(RedChannel *channel, PipeItem *item)
if (channel->send_data.blocked) {
red_receive(channel);
- red_send_data(channel, NULL);
+ red_send_data(channel);
}
// todo: different push for each channel
red_push(common->worker);
@@ -9739,7 +9736,7 @@ static void red_wait_pipe_item_sent(RedChannel *channel, PipeItem *item)
while((item_in_pipe = ring_item_is_linked(&item->link)) && (red_now() < end_time)) {
usleep(CHANNEL_PUSH_SLEEP_DURATION);
red_receive(channel);
- red_send_data(channel, NULL);
+ red_send_data(channel);
red_push(common->worker);
}