summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@gmail.com>2013-09-02 21:47:35 +0200
committerJonathon Jongsma <jjongsma@redhat.com>2015-01-09 14:21:14 -0600
commit3b8bb14bdadea44efd1471b6c0219563eae0c275 (patch)
treea8b0d0757ea860e02f321f52015b8bee2576cbfd
parent9b29311ba026756ff14d940ed5abe4b3f4d71a3b (diff)
downloadspice-3b8bb14bdadea44efd1471b6c0219563eae0c275.tar.gz
spice-3b8bb14bdadea44efd1471b6c0219563eae0c275.tar.xz
spice-3b8bb14bdadea44efd1471b6c0219563eae0c275.zip
server: move dispatcher GSource handling code
-rw-r--r--server/dispatcher.c25
-rw-r--r--server/dispatcher.h2
-rw-r--r--server/red_worker.c27
-rw-r--r--server/spice_server_utils.h1
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)