[Spice-devel] [spice-server 4/4] worker: Simplify flush_commands()

Christophe Fergeau cfergeau at redhat.com
Wed Aug 30 16:34:54 UTC 2017


red_disconnect_display() is duplicating what red_channel_disconnect()
already does, so red_disconnect_display() and red_disconnect_cursor()
are actually identical code-wise. We can directly call
red_channel_disconnect() from flush_commands() rather than passing a
'red_disconnect_t disconnect' argument to that function.

Signed-off-by: Christophe Fergeau <cfergeau at redhat.com>
---
 server/red-worker.c | 28 +++++-----------------------
 1 file changed, 5 insertions(+), 23 deletions(-)

diff --git a/server/red-worker.c b/server/red-worker.c
index 109db63e0..fc009454c 100644
--- a/server/red-worker.c
+++ b/server/red-worker.c
@@ -284,17 +284,6 @@ static bool red_process_is_blocked(RedWorker *worker)
            red_channel_max_pipe_size(RED_CHANNEL(worker->display_channel)) > MAX_PIPE_SIZE;
 }
 
-static void red_disconnect_display(RedWorker *worker)
-{
-    spice_warning("update timeout");
-
-    // TODO: we need to record the client that actually causes the timeout. So
-    // we need to check the locations of the various pipe heads when counting,
-    // and disconnect only those/that.
-    red_channel_apply_clients(RED_CHANNEL(worker->display_channel),
-                              red_channel_client_disconnect);
-}
-
 static void red_migrate_display(DisplayChannel *display, RedChannelClient *rcc)
 {
     /* We need to stop the streams, and to send upgrade_items to the client.
@@ -314,10 +303,8 @@ static void red_migrate_display(DisplayChannel *display, RedChannelClient *rcc)
 }
 
 typedef int (*red_process_t)(RedWorker *worker, int *ring_is_empty);
-typedef void (*red_disconnect_t)(RedWorker *worker);
-
 static void flush_commands(RedWorker *worker, RedChannel *red_channel,
-                           red_process_t process, red_disconnect_t disconnect)
+                           red_process_t process)
 {
     for (;;) {
         uint64_t end_time;
@@ -346,7 +333,8 @@ static void flush_commands(RedWorker *worker, RedChannel *red_channel,
             // TODO: MC: the whole timeout will break since it takes lowest timeout, should
             // do it client by client.
             if (spice_get_monotonic_time_ns() >= end_time) {
-                disconnect(worker);
+		spice_warning("flush timeout");
+                red_channel_disconnect(red_channel);
             } else {
                 usleep(DISPLAY_CLIENT_RETRY_INTERVAL);
             }
@@ -357,19 +345,13 @@ static void flush_commands(RedWorker *worker, RedChannel *red_channel,
 static void flush_display_commands(RedWorker *worker)
 {
     flush_commands(worker, RED_CHANNEL(worker->display_channel),
-                   red_process_display, red_disconnect_display);
-}
-
-static void red_disconnect_cursor(RedWorker *worker)
-{
-    spice_warning("flush cursor timeout");
-    red_channel_disconnect(RED_CHANNEL(worker->cursor_channel));
+                   red_process_display);
 }
 
 static void flush_cursor_commands(RedWorker *worker)
 {
     flush_commands(worker, RED_CHANNEL(worker->cursor_channel),
-                   red_process_cursor, red_disconnect_cursor);
+                   red_process_cursor);
 }
 
 // TODO: on timeout, don't disconnect all channels immediatly - try to disconnect the slowest ones
-- 
2.13.5



More information about the Spice-devel mailing list