summaryrefslogtreecommitdiffstats
path: root/server/display_channel.c
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@gmail.com>2013-09-17 16:36:29 +0200
committerFabiano Fidêncio <fidencio@redhat.com>2015-02-23 23:00:38 +0100
commit260ec90845a5df32e76d901d1af1606966ec2e31 (patch)
tree9776a0e0a5aa031f74955294dc02cf9c062acdd9 /server/display_channel.c
parentf65f034b70bd2f346fded94359ad8a4d5c95dbbe (diff)
downloadspice-260ec90845a5df32e76d901d1af1606966ec2e31.tar.gz
spice-260ec90845a5df32e76d901d1af1606966ec2e31.tar.xz
spice-260ec90845a5df32e76d901d1af1606966ec2e31.zip
worker: move display_channel_wait_for_migrate_data
Diffstat (limited to 'server/display_channel.c')
-rw-r--r--server/display_channel.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/server/display_channel.c b/server/display_channel.c
index fb7e51b8..92ac23b8 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;
+}