[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