summaryrefslogtreecommitdiffstats
path: root/server/red_worker.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/red_worker.c')
-rw-r--r--server/red_worker.c68
1 files changed, 22 insertions, 46 deletions
diff --git a/server/red_worker.c b/server/red_worker.c
index 0c91b9fa..df5be985 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -404,8 +404,6 @@ typedef struct RedWorker {
clockid_t clockid;
QXLInstance *qxl;
RedDispatcher *red_dispatcher;
-
- int channel;
int running;
struct pollfd poll_fds[MAX_EVENT_SOURCES];
struct SpiceWatch watches[MAX_EVENT_SOURCES];
@@ -9703,23 +9701,6 @@ void handle_dev_create_primary_surface_async(void *opaque, void *payload)
dev_create_primary_surface(worker, msg->surface_id, msg->surface);
}
-/* exception for Dispatcher, data going from red_worker to main thread,
- * TODO: use a different dispatcher?
- * TODO: leave direct usage of channel(fd)? It's only used right after the
- * pthread is created, since the channel duration is the lifetime of the spice
- * server. */
-
-void handle_dev_display_channel_create(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
-
- RedChannel *red_channel;
- // TODO: handle seemless migration. Temp, setting migrate to FALSE
- display_channel_create(worker, FALSE);
- red_channel = &worker->display_channel->common.base;
- send_data(worker->channel, &red_channel, sizeof(RedChannel *));
-}
-
void handle_dev_display_connect(void *opaque, void *payload)
{
RedWorkerMessageDisplayConnect *msg = payload;
@@ -9811,21 +9792,6 @@ static void handle_dev_monitors_config_async(void *opaque, void *payload)
}
/* TODO: special, perhaps use another dispatcher? */
-void handle_dev_cursor_channel_create(void *opaque, void *payload)
-{
- RedWorker *worker = opaque;
- RedChannel *red_channel;
-
- if (!worker->cursor_channel) {
- worker->cursor_channel = cursor_channel_new(worker);
- } else {
- spice_warning("cursor channel already created");
- }
-
- red_channel = RED_CHANNEL(worker->cursor_channel);
- send_data(worker->channel, &red_channel, sizeof(RedChannel *));
-}
-
void handle_dev_cursor_connect(void *opaque, void *payload)
{
RedWorkerMessageCursorConnect *msg = payload;
@@ -10162,16 +10128,6 @@ static void register_callbacks(Dispatcher *dispatcher)
sizeof(RedWorkerMessageSetMouseMode),
DISPATCHER_NONE);
dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_DISPLAY_CHANNEL_CREATE,
- handle_dev_display_channel_create,
- sizeof(RedWorkerMessageDisplayChannelCreate),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
- RED_WORKER_MESSAGE_CURSOR_CHANNEL_CREATE,
- handle_dev_cursor_channel_create,
- sizeof(RedWorkerMessageCursorChannelCreate),
- DISPATCHER_NONE);
- dispatcher_register_handler(dispatcher,
RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT,
handle_dev_destroy_surface_wait,
sizeof(RedWorkerMessageDestroySurfaceWait),
@@ -10236,7 +10192,6 @@ RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher)
worker->red_dispatcher = red_dispatcher;
worker->qxl = qxl;
- worker->channel = dispatcher_get_recv_fd(dispatcher);
register_callbacks(dispatcher);
if (worker->record_fd) {
dispatcher_register_universal_handler(dispatcher, worker_dispatcher_record);
@@ -10265,7 +10220,7 @@ RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher)
worker->poll_fds[i].fd = -1;
}
- worker->poll_fds[0].fd = worker->channel;
+ worker->poll_fds[0].fd = dispatcher_get_recv_fd(dispatcher);
worker->poll_fds[0].events = POLLIN;
worker->watches[0].worker = worker;
worker->watches[0].watch_func = handle_dev_input;
@@ -10290,6 +10245,10 @@ RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher)
red_init_zlib(worker);
worker->event_timeout = INF_EVENT_WAIT;
+ worker->cursor_channel = cursor_channel_new(worker);
+ // TODO: handle seemless migration. Temp, setting migrate to FALSE
+ display_channel_create(worker, FALSE);
+
return worker;
}
@@ -10316,6 +10275,9 @@ SPICE_GNUC_NORETURN static void *red_worker_main(void *arg)
spice_warning("getcpuclockid failed");
}
+ RED_CHANNEL(worker->cursor_channel)->thread_id = pthread_self();
+ RED_CHANNEL(worker->display_channel)->thread_id = pthread_self();
+
for (;;) {
int i, num_events;
unsigned int timeout;
@@ -10400,3 +10362,17 @@ bool red_worker_run(RedWorker *worker)
return r == 0;
}
+
+RedChannel* red_worker_get_cursor_channel(RedWorker *worker)
+{
+ spice_return_val_if_fail(worker, NULL);
+
+ return RED_CHANNEL(worker->cursor_channel);
+}
+
+RedChannel* red_worker_get_display_channel(RedWorker *worker)
+{
+ spice_return_val_if_fail(worker, NULL);
+
+ return RED_CHANNEL(worker->display_channel);
+}