[Spice-devel] [PATCH 3/3] worker: avoid server hanging when no client are connected.

Frediano Ziglio fziglio at redhat.com
Wed Jan 20 08:46:49 PST 2016


> 
> From: Marc-André Lureau <marcandre.lureau at gmail.com>
> 
> ---
>  server/red-worker.c | 27 ++++++++++++++++++---------
>  1 file changed, 18 insertions(+), 9 deletions(-)
> 
> diff --git a/server/red-worker.c b/server/red-worker.c
> index a98c4a6..991a816 100644
> --- a/server/red-worker.c
> +++ b/server/red-worker.c
> @@ -227,7 +227,6 @@ static int red_process_display(RedWorker *worker,
> uint32_t max_pipe_size, int *r
>  {
>      QXLCommandExt ext_cmd;
>      int n = 0;
> -    uint64_t start = spice_get_monotonic_time_ns();
>  
>      if (!worker->running) {
>          *ring_is_empty = TRUE;
> @@ -236,8 +235,23 @@ static int red_process_display(RedWorker *worker,
> uint32_t max_pipe_size, int *r
>  
>      worker->process_display_generation++;
>      *ring_is_empty = FALSE;
> -    while (!display_is_connected(worker) ||
> -           red_channel_max_pipe_size(RED_CHANNEL(worker->display_channel))
> <= max_pipe_size) {
> +    for (;;) {
> +
> +        if (display_is_connected(worker)) {
> +
> +            if
> (red_channel_all_blocked(RED_CHANNEL(worker->display_channel))) {
> +                spice_info("all display clients are blocking");
> +                return n;
> +            }
> +
> +
> +            // TODO: change to average pipe size?
> +            if
> (red_channel_max_pipe_size(RED_CHANNEL(worker->display_channel)) >
> max_pipe_size) {
> +                spice_info("too many items in the display clients pipe
> already");
> +                return n;
> +            }
> +        }
> +
>          if (!worker->qxl->st->qif->get_command(worker->qxl, &ext_cmd)) {
>              *ring_is_empty = TRUE;;
>              if (worker->display_poll_tries < CMD_RING_POLL_RETRIES) {
> @@ -327,13 +341,8 @@ static int red_process_display(RedWorker *worker,
> uint32_t max_pipe_size, int *r
>              spice_error("bad command type");
>          }
>          n++;
> -        if ((worker->display_channel &&
> -             red_channel_all_blocked(&worker->display_channel->common.base))
> -            || spice_get_monotonic_time_ns() - start > NSEC_PER_SEC / 100) {
> -            worker->event_timeout = 0;
> -            return n;
> -        }
>      }
> +
>      return n;
>  }
>  

I don't remember why I have this patch still around.

Frediano


More information about the Spice-devel mailing list