[Spice-devel] [PATCH 22/24] server/red_channel: don't set blocked when ack window full

Alon Levy alevy at redhat.com
Wed Jan 19 10:08:08 PST 2011


blocked is set only on output block.
---
 server/red_channel.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/server/red_channel.c b/server/red_channel.c
index 9ad2e5a..0eba73c 100644
--- a/server/red_channel.c
+++ b/server/red_channel.c
@@ -574,18 +574,20 @@ void red_channel_pipe_add_type(RedChannel *channel, int pipe_item_type)
     red_channel_push(channel);
 }
 
+static inline int red_channel_waiting_for_ack(RedChannel *channel)
+{
+    return (channel->handle_acks && (channel->ack_data.messages_window > channel->ack_data.client_window * 2));
+}
+
 static inline PipeItem *red_channel_pipe_get(RedChannel *channel)
 {
     PipeItem *item;
 
     if (!channel || channel->send_data.blocked ||
+        red_channel_waiting_for_ack(channel) ||
         !(item = (PipeItem *)ring_get_tail(&channel->pipe))) {
         return NULL;
     }
-    if (channel->handle_acks && (channel->ack_data.messages_window > channel->ack_data.client_window * 2)) {
-        channel->send_data.blocked = TRUE;
-        return NULL;
-    }
     --channel->pipe_size;
     ring_remove(&item->link);
     return item;
-- 
1.7.3.4



More information about the Spice-devel mailing list