[Spice-devel] [PATCH 07/18] move red_dispatcher_on_vm_stop and red_dispatcher_on_vm_start to RedsState
Frediano Ziglio
fziglio at redhat.com
Mon Feb 15 16:01:08 UTC 2016
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);
+}
--
2.5.0
More information about the Spice-devel
mailing list