Allows to destroy a RedDispatcher object Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/red_dispatcher.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ server/red_dispatcher.h | 1 + 2 files changed, 55 insertions(+) diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c index 660dad8..16e4cc3 100644 --- a/server/red_dispatcher.c +++ b/server/red_dispatcher.c @@ -67,6 +67,8 @@ struct RedDispatcher { pthread_mutex_t async_lock; QXLDevSurfaceCreate surface_create; unsigned int max_monitors; + RedChannel *display_channel; + RedChannel *cursor_channel; }; extern uint32_t streaming_video; @@ -1157,6 +1159,7 @@ void red_dispatcher_init(QXLInstance *qxl) red_channel_set_cap(display_channel, SPICE_DISPLAY_CAP_PREF_COMPRESSION); red_channel_set_cap(display_channel, SPICE_DISPLAY_CAP_STREAM_REPORT); reds_register_channel(display_channel); + red_dispatcher->display_channel = display_channel; } cursor_channel = red_dispatcher_cursor_channel_create(red_dispatcher); @@ -1168,6 +1171,7 @@ void red_dispatcher_init(QXLInstance *qxl) red_channel_register_client_cbs(cursor_channel, &client_cbs); red_channel_set_data(cursor_channel, red_dispatcher); reds_register_channel(cursor_channel); + red_dispatcher->cursor_channel = cursor_channel; } qxl->st->dispatcher = red_dispatcher; @@ -1178,6 +1182,56 @@ void red_dispatcher_init(QXLInstance *qxl) qxl->st->qif->set_compression_level(qxl, calc_compression_level()); } +void red_dispatcher_destroy(QXLInstance *qxl) +{ + RedDispatcher *red_dispatcher; + RedWorkerMessageClose message; + RingItem *item, *next; + + spice_return_if_fail(qxl->st != NULL && qxl->st->dispatcher != NULL); + + // TODO implement it + // qxl->st->qif->detach_worker(qxl, &red_dispatcher->base); + + red_dispatcher = qxl->st->dispatcher; + + RedDispatcher **curr = &dispatchers; + while (*curr) { + if (*curr == red_dispatcher) { + *curr = red_dispatcher->next; + break; + } + curr = &(*curr)->next; + } + + /* deregister channels (display and cursor) */ + if (red_dispatcher->cursor_channel) + reds_unregister_channel(red_dispatcher->cursor_channel); + if (red_dispatcher->display_channel) + reds_unregister_channel(red_dispatcher->display_channel); + + /* send message to close thread */ + dispatcher_send_message(&red_dispatcher->dispatcher, + RED_WORKER_MESSAGE_CLOSE_WORKER, + &message); + pthread_join(red_dispatcher->worker_thread, NULL); + + dispatcher_destroy(&red_dispatcher->dispatcher); + + /* destroy Ring async_commands */ + RING_FOREACH_SAFE(item, next, &red_dispatcher->async_commands) { + free(item); + } + + pthread_mutex_destroy(&red_dispatcher->async_lock); + + qxl->st->dispatcher = NULL; + free(red_dispatcher); + + num_active_workers = 0; +} + + struct Dispatcher *red_dispatcher_get_dispatcher(RedDispatcher *red_dispatcher) { return &red_dispatcher->dispatcher; diff --git a/server/red_dispatcher.h b/server/red_dispatcher.h index 3461ba4..a50ae15 100644 --- a/server/red_dispatcher.h +++ b/server/red_dispatcher.h @@ -25,6 +25,7 @@ struct RedDispatcher; typedef struct AsyncCommand AsyncCommand; void red_dispatcher_init(QXLInstance *qxl); +void red_dispatcher_destroy(QXLInstance *qxl); void red_dispatcher_set_mm_time(uint32_t); void red_dispatcher_on_ic_change(void); -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel