summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@gmail.com>2013-10-03 22:54:30 +0200
committerMarc-André Lureau <marcandre.lureau@gmail.com>2013-10-07 16:33:20 +0200
commit1d18b7e98ab268c755933061d77ccc7a981815e2 (patch)
tree8335fa9a97dfdb21d5d19d831674e3276916d15c
parent961fa773654b51dc8631e1113371b1c3feb21aaf (diff)
downloadspice-1d18b7e98ab268c755933061d77ccc7a981815e2.tar.gz
spice-1d18b7e98ab268c755933061d77ccc7a981815e2.tar.xz
spice-1d18b7e98ab268c755933061d77ccc7a981815e2.zip
server: set dispatcher before calling attache_worker
This allows to call spice_qxl_add_memslot during attache_worker(), like done in the tests.
-rw-r--r--server/red_dispatcher.c12
-rw-r--r--server/red_dispatcher.h3
-rw-r--r--server/reds.c2
3 files changed, 10 insertions, 7 deletions
diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c
index 03a4c4ae..fd6c2e12 100644
--- a/server/red_dispatcher.c
+++ b/server/red_dispatcher.c
@@ -1072,7 +1072,7 @@ static RedChannel *red_dispatcher_cursor_channel_create(RedDispatcher *dispatche
return cursor_channel;
}
-RedDispatcher *red_dispatcher_init(QXLInstance *qxl)
+void red_dispatcher_init(QXLInstance *qxl)
{
RedDispatcher *red_dispatcher;
RedWorkerMessage message;
@@ -1085,6 +1085,8 @@ RedDispatcher *red_dispatcher_init(QXLInstance *qxl)
sigset_t curr_sig_mask;
ClientCbs client_cbs = { NULL, };
+ spice_return_if_fail(qxl->st->dispatcher == NULL);
+
quic_init();
sw_canvas_init();
#ifdef USE_OPENGL
@@ -1175,12 +1177,12 @@ RedDispatcher *red_dispatcher_init(QXLInstance *qxl)
reds_register_channel(cursor_channel);
}
- qxl->st->qif->attache_worker(qxl, &red_dispatcher->base);
- qxl->st->qif->set_compression_level(qxl, calc_compression_level());
-
+ qxl->st->dispatcher = red_dispatcher;
red_dispatcher->next = dispatchers;
dispatchers = red_dispatcher;
- return red_dispatcher;
+
+ qxl->st->qif->attache_worker(qxl, &red_dispatcher->base);
+ qxl->st->qif->set_compression_level(qxl, calc_compression_level());
}
struct Dispatcher *red_dispatcher_get_dispatcher(RedDispatcher *red_dispatcher)
diff --git a/server/red_dispatcher.h b/server/red_dispatcher.h
index 7d23b119..907b7c7c 100644
--- a/server/red_dispatcher.h
+++ b/server/red_dispatcher.h
@@ -21,9 +21,10 @@
#include "red_channel.h"
struct RedChannelClient;
+struct RedDispatcher;
typedef struct AsyncCommand AsyncCommand;
-struct RedDispatcher *red_dispatcher_init(QXLInstance *qxl);
+void red_dispatcher_init(QXLInstance *qxl);
void red_dispatcher_set_mm_time(uint32_t);
void red_dispatcher_on_ic_change(void);
diff --git a/server/reds.c b/server/reds.c
index 0f81a32f..1456b751 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -3771,7 +3771,7 @@ SPICE_GNUC_VISIBLE int spice_server_add_interface(SpiceServer *s,
qxl = SPICE_CONTAINEROF(sin, QXLInstance, base);
qxl->st = spice_new0(QXLState, 1);
qxl->st->qif = SPICE_CONTAINEROF(interface, QXLInterface, base);
- qxl->st->dispatcher = red_dispatcher_init(qxl);
+ red_dispatcher_init(qxl);
} else if (strcmp(interface->type, SPICE_INTERFACE_TABLET) == 0) {
spice_info("SPICE_INTERFACE_TABLET");