[Spice-devel] [PATCH 22/24] worker: make sure we dispatch after releasing items

Frediano Ziglio fziglio at redhat.com
Tue Dec 1 07:56:58 PST 2015


> 
> From: Marc-André Lureau <marcandre.lureau at gmail.com>
> 
> ---
>  server/display-channel.c |  2 ++
>  server/red_worker.c      | 10 ++++++++++
>  server/red_worker.h      |  1 +
>  3 files changed, 13 insertions(+)
> 
> diff --git a/server/display-channel.c b/server/display-channel.c
> index d168190..6b9affc 100644
> --- a/server/display-channel.c
> +++ b/server/display-channel.c
> @@ -1968,9 +1968,11 @@ static void hold_item(RedChannelClient *rcc, PipeItem
> *item)
>  static void release_item(RedChannelClient *rcc, PipeItem *item, int
>  item_pushed)
>  {
>      DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
> +    RedWorker *worker = DCC_TO_WORKER(dcc);
>  
>      spice_return_if_fail(item != NULL);
>      dcc_release_item(dcc, item, item_pushed);
> +    red_worker_update_timeout(worker, 0);
>  }
>  
>  static int handle_migrate_flush_mark(RedChannelClient *rcc)
> diff --git a/server/red_worker.c b/server/red_worker.c
> index 93ed8d0..8d1802e 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -110,6 +110,14 @@ RedMemSlotInfo* red_worker_get_memslot(RedWorker
> *worker)
>      return &worker->mem_slots;
>  }
>  
> +void red_worker_update_timeout(RedWorker *worker, gint timeout)
> +{
> +    spice_return_if_fail(worker != NULL);
> +    spice_return_if_fail(timeout >= 0);
> +
> +    worker->timeout = MIN(worker->timeout, timeout);
> +}
> +
>  static int display_is_connected(RedWorker *worker)
>  {
>      return (worker->display_channel && red_channel_is_connected(
> @@ -1641,6 +1649,8 @@ static gboolean worker_source_prepare(GSource *source,
> gint *timeout)
>      *timeout = worker->timeout;
>      *timeout = MIN(worker->timeout,
>                     display_channel_get_streams_timeout(worker->display_channel));
> +    if (*timeout == 0)
> +        return TRUE;
>  
>      return FALSE; /* do no timeout poll */
>  }
> diff --git a/server/red_worker.h b/server/red_worker.h
> index bfbc616..236c2f8 100644
> --- a/server/red_worker.h
> +++ b/server/red_worker.h
> @@ -94,6 +94,7 @@ static inline void red_pipes_add_verb(RedChannel *channel,
> uint16_t verb)
>  
>  RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher);
>  bool       red_worker_run(RedWorker *worker);
> +void       red_worker_update_timeout(RedWorker *worker, gint timeout);
>  QXLInstance* red_worker_get_qxl(RedWorker *worker);
>  RedChannel* red_worker_get_cursor_channel(RedWorker *worker);
>  RedChannel* red_worker_get_display_channel(RedWorker *worker);
> --
> 2.4.3

This basically add an iteration after current one of every bunch of PipeItems
handled. Is not clear why now this code is required. Is it require after
Glib loop code? Why?

Frediano


More information about the Spice-devel mailing list