From 1cbf6b3ab69a1e789ebb52c146d46f637a290e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Tue, 17 Sep 2013 16:36:29 +0200 Subject: [PATCH] worker: move display_channel_wait_for_migrate_data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Acked-by: Fabiano FidĂȘncio --- server/display-channel.c | 31 +++++++++++++++++++++++++++++++ server/display-channel.h | 1 + server/red_worker.c | 31 ------------------------------- 3 files changed, 32 insertions(+), 31 deletions(-) diff --git a/server/display-channel.c b/server/display-channel.c index 9990c710..37ba5c31 100644 --- a/server/display-channel.c +++ b/server/display-channel.c @@ -807,3 +807,34 @@ int display_channel_add_drawable(DisplayChannel *display, Drawable *drawable) return ret; } + +int display_channel_wait_for_migrate_data(DisplayChannel *display) +{ + uint64_t end_time = red_get_monotonic_time() + DISPLAY_CLIENT_MIGRATE_DATA_TIMEOUT; + RedChannel *channel = &display->common.base; + RedChannelClient *rcc; + + spice_debug(NULL); + spice_assert(channel->clients_num == 1); + + rcc = SPICE_CONTAINEROF(ring_get_head(&channel->clients), RedChannelClient, channel_link); + spice_assert(red_channel_client_waits_for_migrate_data(rcc)); + + for (;;) { + red_channel_client_receive(rcc); + if (!red_channel_client_is_connected(rcc)) { + break; + } + + if (!red_channel_client_waits_for_migrate_data(rcc)) { + return TRUE; + } + if (red_get_monotonic_time() > end_time) { + spice_warning("timeout"); + red_channel_client_disconnect(rcc); + break; + } + usleep(DISPLAY_CLIENT_RETRY_INTERVAL); + } + return FALSE; +} diff --git a/server/display-channel.h b/server/display-channel.h index 8c53aefe..69ceb3c3 100644 --- a/server/display-channel.h +++ b/server/display-channel.h @@ -268,6 +268,7 @@ int display_channel_add_drawable (DisplayCha Drawable *drawable); void display_channel_current_flush (DisplayChannel *display, int surface_id); +int display_channel_wait_for_migrate_data (DisplayChannel *display); static inline int is_equal_path(SpicePath *path1, SpicePath *path2) { diff --git a/server/red_worker.c b/server/red_worker.c index a6e6b6a5..32612d50 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -6911,37 +6911,6 @@ static void handle_dev_stop(void *opaque, void *payload) } } -static int display_channel_wait_for_migrate_data(DisplayChannel *display) -{ - uint64_t end_time = red_get_monotonic_time() + DISPLAY_CLIENT_MIGRATE_DATA_TIMEOUT; - RedChannel *channel = &display->common.base; - RedChannelClient *rcc; - - spice_debug(NULL); - spice_assert(channel->clients_num == 1); - - rcc = SPICE_CONTAINEROF(ring_get_head(&channel->clients), RedChannelClient, channel_link); - spice_assert(red_channel_client_waits_for_migrate_data(rcc)); - - for (;;) { - red_channel_client_receive(rcc); - if (!red_channel_client_is_connected(rcc)) { - break; - } - - if (!red_channel_client_waits_for_migrate_data(rcc)) { - return TRUE; - } - if (red_get_monotonic_time() > end_time) { - spice_warning("timeout"); - red_channel_client_disconnect(rcc); - break; - } - usleep(DISPLAY_CLIENT_RETRY_INTERVAL); - } - return FALSE; -} - static void handle_dev_start(void *opaque, void *payload) { RedWorker *worker = opaque;