Simplify serial sending packets

serial was the future serial to send while last_sent_serial was the
last sent.
serial sent started from 1.
To make sure sequence variable is updated just before sending the
message, not every message prepared.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
This commit is contained in:
Frediano Ziglio 2016-09-18 07:17:06 +01:00
parent d06fd6a2f9
commit 07f1e3a296
2 changed files with 5 additions and 27 deletions

View File

@ -43,7 +43,6 @@ struct RedChannelClientPrivate
uint32_t size;
RedPipeItem *item;
int blocked;
uint64_t serial;
uint64_t last_sent_serial;
struct {

View File

@ -166,26 +166,9 @@ static void red_channel_client_reset_send_data(RedChannelClient *rcc)
rcc->priv->send_data.header.set_msg_type(&rcc->priv->send_data.header, 0);
rcc->priv->send_data.header.set_msg_size(&rcc->priv->send_data.header, 0);
/* Keeping the serial consecutive: resetting it if reset_send_data
* has been called before, but no message has been sent since then.
*/
if (rcc->priv->send_data.last_sent_serial != rcc->priv->send_data.serial) {
spice_assert(rcc->priv->send_data.serial - rcc->priv->send_data.last_sent_serial == 1);
/* When the urgent marshaller is active, the serial was incremented by
* the call to reset_send_data that was made for the main marshaller.
* The urgent msg receives this serial, and the main msg serial is
* the following one. Thus, (rcc->priv->send_data.serial - rcc->priv->send_data.last_sent_serial)
* should be 1 in this case*/
if (!red_channel_client_urgent_marshaller_is_active(rcc)) {
rcc->priv->send_data.serial = rcc->priv->send_data.last_sent_serial;
}
}
rcc->priv->send_data.serial++;
if (!rcc->priv->is_mini_header) {
spice_assert(rcc->priv->send_data.marshaller != rcc->priv->send_data.urgent.marshaller);
rcc->priv->send_data.header.set_msg_sub_list(&rcc->priv->send_data.header, 0);
rcc->priv->send_data.header.set_msg_serial(&rcc->priv->send_data.header, rcc->priv->send_data.serial);
}
}
@ -304,10 +287,6 @@ static void red_channel_client_restore_main_sender(RedChannelClient *rcc)
spice_marshaller_reset(rcc->priv->send_data.urgent.marshaller);
rcc->priv->send_data.marshaller = rcc->priv->send_data.main.marshaller;
rcc->priv->send_data.header.data = rcc->priv->send_data.main.header_data;
if (!rcc->priv->is_mini_header) {
rcc->priv->send_data.header.set_msg_serial(&rcc->priv->send_data.header,
rcc->priv->send_data.serial);
}
rcc->priv->send_data.item = rcc->priv->send_data.main.item;
}
@ -588,7 +567,7 @@ static void full_header_set_msg_serial(SpiceDataHeaderOpaque *header, uint64_t s
static void mini_header_set_msg_serial(SpiceDataHeaderOpaque *header, uint64_t serial)
{
spice_error("attempt to set header serial on mini header");
/* ignore serial, not supported by mini header */
}
static void full_header_set_msg_sub_list(SpiceDataHeaderOpaque *header, uint32_t sub_list)
@ -1248,8 +1227,9 @@ void red_channel_client_begin_send_message(RedChannelClient *rcc)
rcc->priv->send_data.header.set_msg_size(&rcc->priv->send_data.header,
rcc->priv->send_data.size -
rcc->priv->send_data.header.header_size);
rcc->priv->send_data.header.set_msg_serial(&rcc->priv->send_data.header,
++rcc->priv->send_data.last_sent_serial);
rcc->priv->ack_data.messages_window++;
rcc->priv->send_data.last_sent_serial = rcc->priv->send_data.serial;
rcc->priv->send_data.header.data = NULL; /* avoid writing to this until we have a new message */
red_channel_client_send(rcc);
}
@ -1269,13 +1249,12 @@ SpiceMarshaller *red_channel_client_switch_to_urgent_sender(RedChannelClient *rc
uint64_t red_channel_client_get_message_serial(RedChannelClient *rcc)
{
return rcc->priv->send_data.serial;
return rcc->priv->send_data.last_sent_serial + 1;
}
void red_channel_client_set_message_serial(RedChannelClient *rcc, uint64_t serial)
{
rcc->priv->send_data.last_sent_serial = serial;
rcc->priv->send_data.serial = serial;
rcc->priv->send_data.last_sent_serial = serial - 1;
}
static inline gboolean prepare_pipe_add(RedChannelClient *rcc, RedPipeItem *item)