On Mon, 2016-02-15 at 16:01 +0000, Frediano Ziglio wrote: > Signed-off-by: Jonathon Jongsma <jjongsma@xxxxxxxxxx> > Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > --- > 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@xxxxxxxxxx> _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel