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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Acked-by: Christophe Fergeau <cfergeau@xxxxxxxxxx>

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@xxxxxxxxxx>
> ---
> 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@xxxxxxxxxxxxxxxxxxxxx
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]