[Spice-devel] [PATCH spice-server v2 2/4] red-channel-client: Prevent too tight loop waiting for ACKs

Frediano Ziglio fziglio at redhat.com
Mon Sep 18 15:04:55 UTC 2017


RedChannelClient has a "handle-acks" feature.
If this feature is enabled, after the configured number of messages it
waits for an ACK from the client.
If is waiting for an ACK it stops sending messages.
However the write notification was not disabled, causing the loop event
to always trigger, as the socket in this case is ready to accept data.
Specifically red_channel_client_event is continuously called.
This is noticeable using slow network environments and having
some additional loop instrumentation.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
Changes since v2:
- updated commit message specifying the function called in the loop;
- removed SPICE_WATCH_EVENTS_READ_WRITE definition.
---
 server/red-channel-client.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/server/red-channel-client.c b/server/red-channel-client.c
index 764e6cd7e..78e6589bb 100644
--- a/server/red-channel-client.c
+++ b/server/red-channel-client.c
@@ -1327,7 +1327,8 @@ void red_channel_client_push(RedChannelClient *rcc)
     while ((pipe_item = red_channel_client_pipe_item_get(rcc))) {
         red_channel_client_send_item(rcc, pipe_item);
     }
-    if (red_channel_client_no_item_being_sent(rcc) && g_queue_is_empty(&rcc->priv->pipe)) {
+    if ((red_channel_client_no_item_being_sent(rcc) && g_queue_is_empty(&rcc->priv->pipe)) ||
+        red_channel_client_waiting_for_ack(rcc)) {
         red_channel_client_watch_update_mask(rcc, SPICE_WATCH_EVENT_READ);
     }
     rcc->priv->during_send = FALSE;
@@ -1452,6 +1453,8 @@ bool red_channel_client_handle_message(RedChannelClient *rcc, uint16_t type,
     case SPICE_MSGC_ACK:
         if (rcc->priv->ack_data.client_generation == rcc->priv->ack_data.generation) {
             rcc->priv->ack_data.messages_window -= rcc->priv->ack_data.client_window;
+            red_channel_client_watch_update_mask(rcc,
+                                                 SPICE_WATCH_EVENT_READ|SPICE_WATCH_EVENT_WRITE);
             red_channel_client_push(rcc);
         }
         break;
-- 
2.13.5



More information about the Spice-devel mailing list