[Spice-devel] [PATCH] dispatcher: move channel final initialization to red-worker

Frediano Ziglio fziglio at redhat.com
Fri Dec 18 04:02:45 PST 2015


CursorChannel and DisplayChannel was initialized half in red_worker_new
and half in red_dispatcher_init using some accessor for RedWorker
(red_worker_get_cursor_channel and red_worker_get_display_channel).
Moving directly into red_worker_new make easier to follow code path.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 server/red-dispatcher.c | 35 ++++++++++++-----------------------
 server/red-worker.c     | 32 +++++++++++++++++---------------
 server/red-worker.h     |  6 +++---
 3 files changed, 32 insertions(+), 41 deletions(-)

diff --git a/server/red-dispatcher.c b/server/red-dispatcher.c
index 0810798..cce2339 100644
--- a/server/red-dispatcher.c
+++ b/server/red-dispatcher.c
@@ -994,8 +994,8 @@ void red_dispatcher_async_complete(struct RedDispatcher *dispatcher,
 void red_dispatcher_init(QXLInstance *qxl)
 {
     RedDispatcher *red_dispatcher;
-    RedChannel *channel;
-    ClientCbs client_cbs = { NULL, };
+    ClientCbs client_cursor_cbs = { NULL, };
+    ClientCbs client_display_cbs = { NULL, };
 
     spice_return_if_fail(qxl != NULL);
     spice_return_if_fail(qxl->st->dispatcher == NULL);
@@ -1034,28 +1034,17 @@ void red_dispatcher_init(QXLInstance *qxl)
 
     red_dispatcher->max_monitors = UINT_MAX;
 
+    client_cursor_cbs.connect = red_dispatcher_set_cursor_peer;
+    client_cursor_cbs.disconnect = red_dispatcher_disconnect_cursor_peer;
+    client_cursor_cbs.migrate = red_dispatcher_cursor_migrate;
+
+    client_display_cbs.connect = red_dispatcher_set_display_peer;
+    client_display_cbs.disconnect = red_dispatcher_disconnect_display_peer;
+    client_display_cbs.migrate = red_dispatcher_display_migrate;
+
     // TODO: reference and free
-    RedWorker *worker = red_worker_new(qxl, red_dispatcher);
-
-    // TODO: move to their respective channel files
-    channel = red_worker_get_cursor_channel(worker);
-    client_cbs.connect = red_dispatcher_set_cursor_peer;
-    client_cbs.disconnect = red_dispatcher_disconnect_cursor_peer;
-    client_cbs.migrate = red_dispatcher_cursor_migrate;
-    red_channel_register_client_cbs(channel, &client_cbs);
-    red_channel_set_data(channel, red_dispatcher);
-    reds_register_channel(channel);
-
-    channel = red_worker_get_display_channel(worker);
-    client_cbs.connect = red_dispatcher_set_display_peer;
-    client_cbs.disconnect = red_dispatcher_disconnect_display_peer;
-    client_cbs.migrate = red_dispatcher_display_migrate;
-    red_channel_register_client_cbs(channel, &client_cbs);
-    red_channel_set_data(channel, red_dispatcher);
-    red_channel_set_cap(channel, SPICE_DISPLAY_CAP_MONITORS_CONFIG);
-    red_channel_set_cap(channel, SPICE_DISPLAY_CAP_PREF_COMPRESSION);
-    red_channel_set_cap(channel, SPICE_DISPLAY_CAP_STREAM_REPORT);
-    reds_register_channel(channel);
+    RedWorker *worker = red_worker_new(qxl, red_dispatcher, &client_cursor_cbs,
+                                       &client_display_cbs);
 
     red_worker_run(worker);
     num_active_workers = 1;
diff --git a/server/red-worker.c b/server/red-worker.c
index dfaf4ba..77bd37b 100644
--- a/server/red-worker.c
+++ b/server/red-worker.c
@@ -1534,13 +1534,16 @@ static void handle_dev_input(int fd, int event, void *opaque)
     dispatcher_handle_recv_read(red_dispatcher_get_dispatcher(worker->red_dispatcher));
 }
 
-RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher)
+RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher,
+                          const ClientCbs *client_cursor_cbs,
+                          const ClientCbs *client_display_cbs)
 {
     QXLDevInitInfo init_info;
     RedWorker *worker;
     Dispatcher *dispatcher;
     int i;
     const char *record_filename;
+    RedChannel *channel;
 
     qxl->st->qif->get_init_info(qxl, &init_info);
 
@@ -1600,10 +1603,23 @@ RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher)
     worker->event_timeout = INF_EVENT_WAIT;
 
     worker->cursor_channel = cursor_channel_new(worker);
+    channel = RED_CHANNEL(worker->cursor_channel);
+    red_channel_register_client_cbs(channel, client_cursor_cbs);
+    red_channel_set_data(channel, red_dispatcher);
+    reds_register_channel(channel);
+
     // TODO: handle seemless migration. Temp, setting migrate to FALSE
     worker->display_channel = display_channel_new(worker, FALSE, streaming_video,
                                                   init_info.n_surfaces);
 
+    channel = RED_CHANNEL(worker->display_channel);
+    red_channel_register_client_cbs(channel, client_display_cbs);
+    red_channel_set_data(channel, red_dispatcher);
+    red_channel_set_cap(channel, SPICE_DISPLAY_CAP_MONITORS_CONFIG);
+    red_channel_set_cap(channel, SPICE_DISPLAY_CAP_PREF_COMPRESSION);
+    red_channel_set_cap(channel, SPICE_DISPLAY_CAP_STREAM_REPORT);
+    reds_register_channel(channel);
+
     return worker;
 }
 
@@ -1710,20 +1726,6 @@ 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);
-}
-
 clockid_t red_worker_get_clockid(RedWorker *worker)
 {
     spice_return_val_if_fail(worker, 0);
diff --git a/server/red-worker.h b/server/red-worker.h
index 1f0cd99..1e7fd53 100644
--- a/server/red-worker.h
+++ b/server/red-worker.h
@@ -92,11 +92,11 @@ static inline void red_pipes_add_verb(RedChannel *channel, uint16_t verb)
     }
 }
 
-RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher);
+RedWorker* red_worker_new(QXLInstance *qxl, RedDispatcher *red_dispatcher,
+                          const ClientCbs *client_cursor_cbs,
+                          const ClientCbs *client_display_cbs);
 bool       red_worker_run(RedWorker *worker);
 QXLInstance* red_worker_get_qxl(RedWorker *worker);
-RedChannel* red_worker_get_cursor_channel(RedWorker *worker);
-RedChannel* red_worker_get_display_channel(RedWorker *worker);
 clockid_t red_worker_get_clockid(RedWorker *worker);
 RedMemSlotInfo* red_worker_get_memslot(RedWorker *worker);
 
-- 
2.4.3



More information about the Spice-devel mailing list