Hi,
See comments inline.
On 12/06/2010 11:49 AM, Alon Levy wrote:
---
server/inputs_channel.c | 406 ++++++++++++++--------------------------------
1 files changed, 124 insertions(+), 282 deletions(-)
diff --git a/server/inputs_channel.c b/server/inputs_channel.c
index f3e71f3..2d76d03 100644
--- a/server/inputs_channel.c
+++ b/server/inputs_channel.c
<snip>
@@ -153,132 +141,22 @@ const VDAgentMouseState *inputs_get_mouse_state(void)
return&inputs_channel->mouse_state;
}
-static int handle_incoming(RedsStreamContext *peer, IncomingHandler *handler)
+static uint8_t *inputs_channel_alloc_msg_rcv_buf(RedChannel *channel,
SpiceDataHeader *msg_header)
{
<snip lots of - lines>
+ InputsChannel *inputs_channel = SPICE_CONTAINEROF(channel, InputsChannel,
base);
+
+ return inputs_channel->recv_buf;
}
Hmm, does red_channel guarantee that this function will only get called once?
IOW will
red_channel never call this twice and expect to get 2 different buffers then ?
Also how does red_channel now the size of the buffer? I assume the size of the
buffer
is supposed to be determined by the alloc function by checking the msg_header ?
Should we then not at least verify here that the static buffer is large enough ?
<snip lots of good stuff (mostly - lines)>
-static int marshaller_outgoing_write(SpiceMarshaller *m,
- InputsChannel *state)
+static void inputs_channel_release_pipe_item(RedChannel *channel,
+ PipeItem *base, int item_pushed)
{
- SpiceDataHeader *header = (SpiceDataHeader *)spice_marshaller_get_ptr(m);
+ // All PipeItems we push are InputsPipeItem
+ InputsPipeItem *item = (InputsPipeItem*)base;
+
+ if (item->data) {
+ free(item->data);
+ }
+}
+
Hmm, we are responsible for allocating the item itself too in
inputs_pipe_item_new
should we not release it then (just checking) ?
+static void inputs_channel_send_item(RedChannel *channel, PipeItem *base)
+{
+ InputsPipeItem *item = SPICE_CONTAINEROF(base, InputsPipeItem, base);
+ SpiceMarshaller *m = item->m;
uint8_t *data;
size_t len;
int free_data;
+ red_channel_reset_send_data(channel);
+ red_channel_init_send_data(channel, base->type, base);
spice_marshaller_flush(m);
- header->size = spice_marshaller_get_total_size(m) -
sizeof(SpiceDataHeader);
-
+ // TODO: use spice_marshaller_fill_iovec. Right now we are doing something
stupid,
+ // namely copying twice. See reds.c.
data = spice_marshaller_linearize(m, 0,&len,&free_data);
-
- if (outgoing_write(state->peer,&state->out_handler, data, len) !=
OUTGOING_OK) {
- return FALSE;
- }
-
- if (free_data) {
- free(data);
+ item->data = (free_data&& len> 0) ? data : NULL;
+ if (len> 0) {
+ red_channel_add_buf(channel, data, len);
}
-
- return TRUE;
+ spice_marshaller_destroy(m);
+ red_channel_begin_send_message(channel);
}
Hmm (again), so if spice_marshaller_linearize indicates the data should be
free-ed by
the caller, we do so when the item gets destroyed (iow not right now), this
makes me
assume that red_channel_add_buf does not copy the data, but merely stores a
reference
to it. So what if spice_marshaller_linearize() does not say the caller should
free
the buffer (iow it is returning some internal buffer). Won't that buffer get
destroyed
then as soon as spice_marshaller_destroy gets called, iow before the channel is
done
with it.
Note if my assumption is wrong and red_channel_add_buf does copy the data, why
delay
freeing the data until the item gets destroyed and not free the data
immediately after
the red_channel_add_buf call ?
<snip more stuff>
static void inputs_migrate(Channel *channel)
{
- InputsChannel *state = (InputsChannel *)channel->data;
- SpiceMarshaller *m;
+ InputsPipeItem *pipe_item = inputs_pipe_item_new(inputs_channel,
PIPE_ITEM_MIGRATE);
+ SpiceMarshaller *m = pipe_item->m;
SpiceMsgMigrate migrate;
- m = marshaller_new_for_outgoing(state, SPICE_MSG_MIGRATE);
-
+ ASSERT(inputs_channel == (InputsChannel *)channel->data);
migrate.flags = 0;
spice_marshall_msg_migrate(m,&migrate);
-
- if (!marshaller_outgoing_write(m, state)) {
- red_printf("write failed");
- }
- spice_marshaller_destroy(m);
+ red_channel_pipe_add(&inputs_channel->base,&pipe_item->base);
}
Question, have you tested migration with these patches ?
<snip more stuff>
Phew all done :)
I'll review the rest of your patches after my lunch break. I'll also try
to remember to start up my irc client then unlike this morning :)
Regards,
Hans
_______________________________________________
Spice-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/spice-devel