[Spice-devel] [PATCH 9/9] server: move dispatcher GSource handling code
Frediano Ziglio
fziglio at redhat.com
Wed Dec 9 04:17:44 PST 2015
From: Marc-André Lureau <marcandre.lureau at gmail.com>
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
---
server/dispatcher.c | 25 +++++++++++++++++++++++++
server/dispatcher.h | 2 ++
server/red-worker.c | 40 ++++++++++++----------------------------
3 files changed, 39 insertions(+), 28 deletions(-)
diff --git a/server/dispatcher.c b/server/dispatcher.c
index d6c03ca..974fa75 100644
--- a/server/dispatcher.c
+++ b/server/dispatcher.c
@@ -289,3 +289,28 @@ int dispatcher_get_recv_fd(Dispatcher *dispatcher)
{
return dispatcher->recv_fd;
}
+
+static gboolean dispatch_cb(GIOChannel *source, GIOCondition condition,
+ gpointer data)
+{
+ Dispatcher *dispatcher = data;
+
+ spice_debug(NULL);
+ dispatcher_handle_recv_read(dispatcher);
+
+ /* FIXME: remove source cb if error */
+ return TRUE;
+}
+
+void dispatcher_attach(Dispatcher *dispatcher, GMainContext *main_context)
+{
+ spice_return_if_fail(dispatcher != NULL);
+ spice_return_if_fail(main_context != NULL);
+
+ GIOChannel *channel = g_io_channel_unix_new(dispatcher->recv_fd);
+ GSource *source = g_io_create_watch(channel, G_IO_IN);
+
+ g_source_set_callback(source, (GSourceFunc)dispatch_cb, dispatcher, NULL);
+ g_source_attach(source, main_context);
+ g_source_unref(source);
+}
diff --git a/server/dispatcher.h b/server/dispatcher.h
index 78ef663..f171332 100644
--- a/server/dispatcher.h
+++ b/server/dispatcher.h
@@ -72,6 +72,8 @@ void dispatcher_send_message(Dispatcher *dispatcher, uint32_t message_type,
void dispatcher_init(Dispatcher *dispatcher, size_t max_message_type,
void *opaque);
+void dispatcher_attach(Dispatcher *dispatcher, GMainContext *main_context);
+
enum {
DISPATCHER_NONE = 0,
DISPATCHER_ACK,
diff --git a/server/red-worker.c b/server/red-worker.c
index ae4ac27..a13039d 100644
--- a/server/red-worker.c
+++ b/server/red-worker.c
@@ -1458,11 +1458,12 @@ static void worker_dispatcher_record(void *opaque, uint32_t message_type, void *
red_record_event(worker->record_fd, 1, message_type, stat_now(worker->clockid));
}
-static void register_callbacks(Dispatcher *dispatcher)
+static void worker_dispatcher_register(RedWorker *worker, Dispatcher *dispatcher)
{
- dispatcher_register_async_done_callback(
- dispatcher,
- worker_handle_dispatcher_async_done);
+ dispatcher_set_opaque(dispatcher, worker);
+
+ dispatcher_register_async_done_callback(dispatcher,
+ worker_handle_dispatcher_async_done);
/* TODO: register cursor & display specific msg in respective channel files */
dispatcher_register_handler(dispatcher,
@@ -1630,21 +1631,11 @@ static void register_callbacks(Dispatcher *dispatcher)
handle_dev_driver_unload,
sizeof(RedWorkerMessageDriverUnload),
DISPATCHER_NONE);
-}
-
-
-static gboolean worker_dispatcher_cb(GIOChannel *source, GIOCondition condition,
- gpointer data)
-{
- RedWorker *worker = data;
-
- spice_debug(NULL);
- dispatcher_handle_recv_read(red_dispatcher_get_dispatcher(worker->red_dispatcher));
-
- return TRUE;
+ dispatcher_attach(dispatcher, worker->main_context);
}
+
typedef struct RedWorkerSource {
GSource source;
RedWorker *worker;
@@ -1719,6 +1710,8 @@ RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher)
worker = spice_new0(RedWorker, 1);
worker->main_context = g_main_context_new();
+ worker->red_dispatcher = red_dispatcher;
+ worker->qxl = qxl;
record_filename = getenv("SPICE_WORKER_RECORD_FILENAME");
if (record_filename) {
@@ -1733,14 +1726,11 @@ RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher)
}
}
dispatcher = red_dispatcher_get_dispatcher(red_dispatcher);
- dispatcher_set_opaque(dispatcher, worker);
-
- worker->red_dispatcher = red_dispatcher;
- worker->qxl = qxl;
- register_callbacks(dispatcher);
+ worker_dispatcher_register(worker, dispatcher);
if (worker->record_fd) {
dispatcher_register_universal_handler(dispatcher, worker_dispatcher_record);
}
+
worker->image_compression = image_compression;
worker->jpeg_state = jpeg_state;
worker->zlib_glz_state = zlib_glz_state;
@@ -1753,13 +1743,7 @@ RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher)
worker->command_counter = stat_add_counter(worker->stat, "commands", TRUE);
#endif
- GIOChannel *channel = g_io_channel_unix_new(dispatcher_get_recv_fd(dispatcher));
- GSource *source = g_io_create_watch(channel, G_IO_IN);
- g_source_set_callback(source, (GSourceFunc)worker_dispatcher_cb, worker, NULL);
- g_source_attach(source, worker->main_context);
- g_source_unref(source);
-
- source = g_source_new(&worker_source_funcs, sizeof(RedWorkerSource));
+ GSource *source = g_source_new(&worker_source_funcs, sizeof(RedWorkerSource));
RedWorkerSource *wsource = (RedWorkerSource *)source;
wsource->worker = worker;
g_source_attach(source, worker->main_context);
--
2.4.3
More information about the Spice-devel
mailing list