[Spice-devel] [PATCH 07/18] move red_dispatcher_on_vm_stop and red_dispatcher_on_vm_start to RedsState

Fabiano Fidêncio ffidenci at redhat.com
Mon Feb 15 22:53:51 UTC 2016


On Mon, 2016-02-15 at 16:01 +0000, Frediano Ziglio wrote:
> Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  server/red-dispatcher.c | 33 +++++++--------------------------
>  server/red-dispatcher.h |  3 +++
>  server/reds.c           | 35 +++++++++++++++++++++++++++++++----
>  3 files changed, 41 insertions(+), 30 deletions(-)
> 
> diff --git a/server/red-dispatcher.c b/server/red-dispatcher.c
> index f634d28..40d13fe 100644
> --- a/server/red-dispatcher.c
> +++ b/server/red-dispatcher.c
> @@ -599,7 +599,7 @@ static void qxl_worker_oom(QXLWorker *qxl_worker)
>      red_dispatcher_oom((RedDispatcher*)qxl_worker);
>  }
>  
> -static void red_dispatcher_start(RedDispatcher *dispatcher)
> +void red_dispatcher_start(RedDispatcher *dispatcher)
>  {
>      RedWorkerMessageStart payload;
>  
> @@ -647,7 +647,7 @@ static void
> red_dispatcher_driver_unload(RedDispatcher *dispatcher)
>                              &payload);
>  }
>  
> -static void red_dispatcher_stop(RedDispatcher *dispatcher)
> +void red_dispatcher_stop(RedDispatcher *dispatcher)
>  {
>      RedWorkerMessageStop payload;
>  
> @@ -682,31 +682,15 @@ static void
> qxl_worker_loadvm_commands(QXLWorker *qxl_worker,
>      red_dispatcher_loadvm_commands((RedDispatcher*)qxl_worker, ext,
> count);
>  }
>  
> -void red_dispatcher_set_compression_level(RedDispatcher *dispatcher,
> int level)
> -{
> -    dispatcher->qxl->st->qif->set_compression_level(dispatcher->qxl, 
> level);
> -}
> -
> -void red_dispatcher_on_vm_stop(void)
> +void red_dispatcher_attach_worker(RedDispatcher *dispatcher)
>  {
> -    RedDispatcher *now = dispatchers;
> -
> -    spice_debug(NULL);
> -    while (now) {
> -        red_dispatcher_stop(now);
> -        now = now->next;
> -    }
> +    QXLInstance *qxl = dispatcher->qxl;
> +    qxl->st->qif->attache_worker(qxl, &dispatcher->base);
>  }
>  
> -void red_dispatcher_on_vm_start(void)
> +void red_dispatcher_set_compression_level(RedDispatcher *dispatcher,
> int level)
>  {
> -    RedDispatcher *now = dispatchers;
> -
> -    spice_debug(NULL);
> -    while (now) {
> -        red_dispatcher_start(now);
> -        now = now->next;
> -    }
> +    dispatcher->qxl->st->qif->set_compression_level(dispatcher->qxl, 
> level);
>  }
>  
>  uint32_t red_dispatcher_qxl_ram_size(void)
> @@ -1028,9 +1012,6 @@ void red_dispatcher_init(QXLInstance *qxl)
>      qxl->st->dispatcher = red_dispatcher;
>      red_dispatcher->next = dispatchers;
>      dispatchers = red_dispatcher;
> -
> -    qxl->st->qif->attache_worker(qxl, &red_dispatcher->base);
> -    qxl->st->qif->set_compression_level(qxl,
> calc_compression_level(reds));
>  }
>  
>  struct Dispatcher *red_dispatcher_get_dispatcher(RedDispatcher
> *red_dispatcher)
> diff --git a/server/red-dispatcher.h b/server/red-dispatcher.h
> index 2279680..9614544 100644
> --- a/server/red-dispatcher.h
> +++ b/server/red-dispatcher.h
> @@ -29,7 +29,10 @@ void red_dispatcher_init(QXLInstance *qxl);
>  void red_dispatcher_on_ic_change(RedDispatcher *dispatcher,
> SpiceImageCompression ic);
>  void red_dispatcher_on_sv_change(RedDispatcher *dispatcher, int sv);
>  void red_dispatcher_set_mouse_mode(RedDispatcher *dispatcher,
> uint32_t mode);
> +void red_dispatcher_attach_worker(RedDispatcher *dispatcher);
>  void red_dispatcher_set_compression_level(RedDispatcher *dispatcher,
> int level);
> +void red_dispatcher_stop(RedDispatcher *dispatcher);
> +void red_dispatcher_start(RedDispatcher *dispatcher);
>  void red_dispatcher_on_vm_stop(void);
>  void red_dispatcher_on_vm_start(void);
>  uint32_t red_dispatcher_qxl_ram_size(void);
> diff --git a/server/reds.c b/server/reds.c
> index 0f8f69a..57b01b0 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -174,6 +174,8 @@ static void
> reds_char_device_remove_state(RedsState *reds, SpiceCharDeviceState
>  static void reds_send_mm_time(RedsState *reds);
>  static void reds_on_ic_change(RedsState *reds);
>  static void reds_on_sv_change(RedsState *reds);
> +static void reds_on_vm_stop(RedsState *reds);
> +static void reds_on_vm_start(RedsState *reds);
>  
>  static VDIReadBuf *vdi_port_state_get_read_buf(VDIPortState *state);
>  static VDIReadBuf *vdi_port_read_buf_ref(VDIReadBuf *buf);
> @@ -3190,6 +3192,7 @@ SPICE_GNUC_VISIBLE int
> spice_server_add_interface(SpiceServer *s,
>          }
>      } else if (strcmp(interface->type, SPICE_INTERFACE_QXL) == 0) {
>          QXLInstance *qxl;
> +        RedDispatcher *dispatcher;
>  
>          spice_info("SPICE_INTERFACE_QXL");
>          if (interface->major_version != SPICE_INTERFACE_QXL_MAJOR ||
> @@ -3204,8 +3207,16 @@ SPICE_GNUC_VISIBLE int
> spice_server_add_interface(SpiceServer *s,
>          qxl->st->scanout.drm_dma_buf_fd = -1;
>          qxl->st->qif = SPICE_CONTAINEROF(interface, QXLInterface,
> base);
>          red_dispatcher_init(qxl);
> -        reds->dispatchers = g_list_prepend(reds->dispatchers, qxl-
> >st->dispatcher);
> -
> +        dispatcher = qxl->st->dispatcher;
> +        reds->dispatchers = g_list_prepend(reds->dispatchers,
> dispatcher);
> +
> +        /* this function has to be called after the dispatcher is on
> the list
> +         * as QXLInstance clients expect the dispatcher to be on the
> list when
> +         * this callback is called. This as clients assume they can
> start the
> +         * dispatchers. Also note that this should be the first
> callback to
> +         * be called. */
> +        red_dispatcher_attach_worker(dispatcher);
> +        red_dispatcher_set_compression_level(dispatcher,
> calc_compression_level(reds));
>      } else if (strcmp(interface->type, SPICE_INTERFACE_TABLET) == 0)
> {
>          SpiceTabletInstance *tablet = SPICE_CONTAINEROF(sin,
> SpiceTabletInstance, base);
>          spice_info("SPICE_INTERFACE_TABLET");
> @@ -3999,7 +4010,7 @@ SPICE_GNUC_VISIBLE void
> spice_server_vm_start(SpiceServer *s)
>          st_item = SPICE_CONTAINEROF(item, SpiceCharDeviceStateItem,
> link);
>          spice_char_device_start(st_item->st);
>      }
> -    red_dispatcher_on_vm_start();
> +    reds_on_vm_start(reds);
>  }
>  
>  SPICE_GNUC_VISIBLE void spice_server_vm_stop(SpiceServer *s)
> @@ -4014,7 +4025,7 @@ SPICE_GNUC_VISIBLE void
> spice_server_vm_stop(SpiceServer *s)
>          st_item = SPICE_CONTAINEROF(item, SpiceCharDeviceStateItem,
> link);
>          spice_char_device_stop(st_item->st);
>      }
> -    red_dispatcher_on_vm_stop();
> +    reds_on_vm_stop(reds);
>  }
>  
>  SPICE_GNUC_VISIBLE void
> spice_server_set_seamless_migration(SpiceServer *s, int enable)
> @@ -4087,3 +4098,19 @@ void reds_on_sv_change(RedsState *reds)
>          red_dispatcher_on_sv_change(d,
> reds_get_streaming_video(reds));
>      }
>  }
> +
> +void reds_on_vm_stop(RedsState *reds)
> +{
> +    GList *l;
> +
> +    for (l = reds->dispatchers; l != NULL; l = l->next)
> +        red_dispatcher_stop(l->data);
> +}
> +
> +void reds_on_vm_start(RedsState *reds)
> +{
> +    GList *l;
> +
> +    for (l = reds->dispatchers; l != NULL; l = l->next)
> +        red_dispatcher_start(l->data);
> +}

Acked-by: Fabiano Fidêncio <fidencio at redhat.com>


More information about the Spice-devel mailing list