|
|
e76f14 |
From a5806c1b4be3f74b25ec733328259e7966af6af6 Mon Sep 17 00:00:00 2001
|
|
|
e76f14 |
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
|
e76f14 |
Date: Mon, 20 Jun 2016 10:18:22 +0100
|
|
|
e76f14 |
Subject: [PATCH] p2v: Poll to make Cancel Conversion button more responsive.
|
|
|
e76f14 |
|
|
|
e76f14 |
Previously cancelling the conversion only set a flag, which was
|
|
|
e76f14 |
checked when the run dialog displayed new output from virt-v2v. When
|
|
|
e76f14 |
virt-v2v was showing hundreds of debugging messages, this wasn't a
|
|
|
e76f14 |
problem, but now that we are hiding those messages, cancelling the
|
|
|
e76f14 |
conversion might mean a wait of seconds or minutes.
|
|
|
e76f14 |
|
|
|
e76f14 |
By polling (albeit infrequently) we can make the cancel button more
|
|
|
e76f14 |
responsive.
|
|
|
e76f14 |
|
|
|
e76f14 |
(cherry picked from commit 6da4941db7f8a85997d6281b9b4c5165768e6489)
|
|
|
e76f14 |
---
|
|
|
e76f14 |
p2v/conversion.c | 27 +++++++++++++++++++++++++--
|
|
|
e76f14 |
1 file changed, 25 insertions(+), 2 deletions(-)
|
|
|
e76f14 |
|
|
|
e76f14 |
diff --git a/p2v/conversion.c b/p2v/conversion.c
|
|
|
e76f14 |
index b54f971..de2a4b2 100644
|
|
|
e76f14 |
--- a/p2v/conversion.c
|
|
|
e76f14 |
+++ b/p2v/conversion.c
|
|
|
e76f14 |
@@ -25,6 +25,7 @@
|
|
|
e76f14 |
#include <fcntl.h>
|
|
|
e76f14 |
#include <inttypes.h>
|
|
|
e76f14 |
#include <unistd.h>
|
|
|
e76f14 |
+#include <poll.h>
|
|
|
e76f14 |
#include <time.h>
|
|
|
e76f14 |
#include <errno.h>
|
|
|
e76f14 |
#include <error.h>
|
|
|
e76f14 |
@@ -346,13 +347,35 @@ start_conversion (struct config *config,
|
|
|
e76f14 |
}
|
|
|
e76f14 |
|
|
|
e76f14 |
/* Read output from the virt-v2v process and echo it through the
|
|
|
e76f14 |
- * notify function, until virt-v2v closes the connection.
|
|
|
e76f14 |
+ * notify function, until virt-v2v closes the connection. We
|
|
|
e76f14 |
+ * actually poll in this loop (albeit it only every 2 seconds) so
|
|
|
e76f14 |
+ * that the user won't have to wait too long between pressing the
|
|
|
e76f14 |
+ * cancel button and having the conversion cancelled.
|
|
|
e76f14 |
*/
|
|
|
e76f14 |
while (!is_cancel_requested ()) {
|
|
|
e76f14 |
+ int fd = mexp_get_fd (control_h);
|
|
|
e76f14 |
+ struct pollfd fds[1];
|
|
|
e76f14 |
+ int rp;
|
|
|
e76f14 |
char buf[257];
|
|
|
e76f14 |
ssize_t r;
|
|
|
e76f14 |
|
|
|
e76f14 |
- r = read (mexp_get_fd (control_h), buf, sizeof buf - 1);
|
|
|
e76f14 |
+ fds[0].fd = fd;
|
|
|
e76f14 |
+ fds[0].events = POLLIN;
|
|
|
e76f14 |
+ fds[0].revents = 0;
|
|
|
e76f14 |
+ rp = poll (fds, 1, 2000 /* ms */);
|
|
|
e76f14 |
+ if (rp == -1) {
|
|
|
e76f14 |
+ /* See comment about this in miniexpect.c. */
|
|
|
e76f14 |
+ if (errno == EIO)
|
|
|
e76f14 |
+ break;
|
|
|
e76f14 |
+ set_conversion_error ("poll: %m");
|
|
|
e76f14 |
+ goto out;
|
|
|
e76f14 |
+ }
|
|
|
e76f14 |
+ else if (rp == 0)
|
|
|
e76f14 |
+ /* Timeout. */
|
|
|
e76f14 |
+ continue;
|
|
|
e76f14 |
+ /* ... else rp == 1, ignore revents and just do the read. */
|
|
|
e76f14 |
+
|
|
|
e76f14 |
+ r = read (fd, buf, sizeof buf - 1);
|
|
|
e76f14 |
if (r == -1) {
|
|
|
e76f14 |
/* See comment about this in miniexpect.c. */
|
|
|
e76f14 |
if (errno == EIO)
|
|
|
e76f14 |
--
|
|
|
aa0300 |
2.7.4
|
|
|
e76f14 |
|