diff options
author | Marc-André Lureau <marcandre.lureau@gmail.com> | 2013-09-02 21:47:35 +0200 |
---|---|---|
committer | Jonathon Jongsma <jjongsma@redhat.com> | 2015-01-09 14:21:14 -0600 |
commit | 3b8bb14bdadea44efd1471b6c0219563eae0c275 (patch) | |
tree | a8b0d0757ea860e02f321f52015b8bee2576cbfd | |
parent | 9b29311ba026756ff14d940ed5abe4b3f4d71a3b (diff) | |
download | spice-3b8bb14bdadea44efd1471b6c0219563eae0c275.tar.gz spice-3b8bb14bdadea44efd1471b6c0219563eae0c275.tar.xz spice-3b8bb14bdadea44efd1471b6c0219563eae0c275.zip |
server: move dispatcher GSource handling code
-rw-r--r-- | server/dispatcher.c | 25 | ||||
-rw-r--r-- | server/dispatcher.h | 2 | ||||
-rw-r--r-- | server/red_worker.c | 27 | ||||
-rw-r--r-- | server/spice_server_utils.h | 1 |
4 files changed, 34 insertions, 21 deletions
diff --git a/server/dispatcher.c b/server/dispatcher.c index 220f6e4f..1f4c68f6 100644 --- a/server/dispatcher.c +++ b/server/dispatcher.c @@ -301,3 +301,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 4d413414..b47ef3c2 100644 --- a/server/dispatcher.h +++ b/server/dispatcher.h @@ -55,6 +55,8 @@ uint32_t dispatcher_read_message(Dispatcher *dispatcher); 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 ca3c3f86..d0ba0a92 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -12040,6 +12040,8 @@ static void worker_dispatcher_record(void *opaque, uint32_t message_type, void * static void worker_dispatcher_register(RedWorker *worker, Dispatcher *dispatcher) { + dispatcher_set_opaque(dispatcher, worker); + dispatcher_register_extra_handler(dispatcher, worker_dispatcher_record); dispatcher_register_async_done_callback(dispatcher, worker_handle_dispatcher_async_done); @@ -12219,21 +12221,11 @@ static void worker_dispatcher_register(RedWorker *worker, 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; @@ -12323,13 +12315,12 @@ RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher) } } dispatcher = red_dispatcher_get_dispatcher(red_dispatcher); - dispatcher_set_opaque(dispatcher, worker); + worker_dispatcher_register(worker, dispatcher); worker->red_dispatcher = red_dispatcher; worker->qxl = qxl; worker->id = qxl->id; worker->channel = dispatcher_get_recv_fd(dispatcher); - worker_dispatcher_register(worker, dispatcher); worker->cursor_visible = TRUE; spice_assert(num_renderers > 0); worker->num_renderers = num_renderers; @@ -12358,13 +12349,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); diff --git a/server/spice_server_utils.h b/server/spice_server_utils.h index 939069b1..96ffc9e4 100644 --- a/server/spice_server_utils.h +++ b/server/spice_server_utils.h @@ -5,6 +5,7 @@ #include <errno.h> #include <string.h> #include <stdbool.h> +#include <glib.h> #include "common/log.h" static inline void set_bit(int index, uint32_t *addr) |