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

Christophe Fergeau cfergeau at redhat.com
Tue Sep 19 09:44:34 UTC 2017


Acked-by: Christophe Fergeau <cfergeau at redhat.com>

On Mon, Sep 18, 2017 at 04:04:55PM +0100, Frediano Ziglio wrote:
> 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
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel


More information about the Spice-devel mailing list