@@ -, +, @@ --- --- a/server/red_dispatcher.c +++ a/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) --- a/server/red_dispatcher.h +++ a/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); --- a/server/reds.c +++ a/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"); --