diff options
author | Marc-André Lureau <marcandre.lureau@gmail.com> | 2013-09-17 16:36:29 +0200 |
---|---|---|
committer | Fabiano Fidêncio <fidencio@redhat.com> | 2015-02-23 23:00:38 +0100 |
commit | 260ec90845a5df32e76d901d1af1606966ec2e31 (patch) | |
tree | 9776a0e0a5aa031f74955294dc02cf9c062acdd9 /server/display_channel.c | |
parent | f65f034b70bd2f346fded94359ad8a4d5c95dbbe (diff) | |
download | spice-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.c | 31 |
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; +} |