From 35e9a9d435af9c67ffbedd244f7d38b7b3956d02 Mon Sep 17 00:00:00 2001 From: Frediano Ziglio Date: Mon, 11 Sep 2017 10:14:23 +0100 Subject: [PATCH] red-channel-client: Simplify red_channel_client_wait_pipe_item_sent loop Avoid repeating the same code twice. red_channel_client_send sends the pending item (or a part of it). If there are no item pending, the function does nothing (so checking for blocked channel is useless). Also red_channel_client_send is already called from red_channel_client_push which has a check for blocked channels, so having calls to both red_channel_client_send() and red_channel_client_push() is redundant. The function on its overall tries to wait for a given item to be sent. The call for red_channel_client_receive is mainly needed to support the cases were to send data messages from the client should be processed (like if "handle-acks" is requested). Moving the loop iteration check inside the for loop instead allows to avoid some duplication. Signed-off-by: Frediano Ziglio Acked-by: Christophe Fergeau --- server/red-channel-client.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/server/red-channel-client.c b/server/red-channel-client.c index 7ca65619..086c5fa4 100644 --- a/server/red-channel-client.c +++ b/server/red-channel-client.c @@ -1776,18 +1776,14 @@ bool red_channel_client_wait_pipe_item_sent(RedChannelClient *rcc, red_pipe_item_ref(&mark_item->base); red_channel_client_pipe_add_after_pos(rcc, &mark_item->base, item_pos); - if (red_channel_client_is_blocked(rcc)) { + for (;;) { red_channel_client_receive(rcc); - red_channel_client_send(rcc); - } - red_channel_client_push(rcc); - - while (mark_item->item_in_pipe && - (timeout == -1 || spice_get_monotonic_time_ns() < end_time)) { - usleep(CHANNEL_BLOCKED_SLEEP_DURATION); - red_channel_client_receive(rcc); - red_channel_client_send(rcc); red_channel_client_push(rcc); + if (!mark_item->item_in_pipe || + (timeout != -1 && spice_get_monotonic_time_ns() >= end_time)) { + break; + } + usleep(CHANNEL_BLOCKED_SLEEP_DURATION); } item_in_pipe = mark_item->item_in_pipe;