aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOt ten Thije <ottenthije@google.com>2010-07-19 13:10:18 +0100
committerOt ten Thije <ottenthije@google.com>2010-07-28 09:39:07 +0100
commitcc19d3eeef59cbd354c1c618f7421d6fe5e0a098 (patch)
tree3e5d5b38c9be72c8013b1efbd1897e6792110795
parent2fa5173bd1ce7341c50adac676a317945f0969c7 (diff)
downloadexternal_qemu-cc19d3eeef59cbd354c1c618f7421d6fe5e0a098.zip
external_qemu-cc19d3eeef59cbd354c1c618f7421d6fe5e0a098.tar.gz
external_qemu-cc19d3eeef59cbd354c1c618f7421d6fe5e0a098.tar.bz2
Fixed infinite loop in qemu_aio_wait() affecting savevm.
Solved by porting a check on AIO operations from QEMU mainline (in mainline commit a76bab4952a1539266490295fb50b78802c467c2). Change-Id: I1d2011776f7cb90d81e36a5cf9381ef956d9a5b9
-rw-r--r--aio-android.c5
-rw-r--r--iolooper-select.c6
-rw-r--r--iolooper.h2
3 files changed, 13 insertions, 0 deletions
diff --git a/aio-android.c b/aio-android.c
index 53f7a6d..2b67579 100644
--- a/aio-android.c
+++ b/aio-android.c
@@ -151,6 +151,11 @@ void qemu_aio_wait(void)
walking_handlers = 0;
+ /* No AIO operations? Get us out of here */
+ if (!iolooper_has_operations(looper)) {
+ break;
+ }
+
/* wait until next event */
ret = iolooper_wait(looper, -1);
diff --git a/iolooper-select.c b/iolooper-select.c
index 74a5a3a..bf7ae8f 100644
--- a/iolooper-select.c
+++ b/iolooper-select.c
@@ -174,3 +174,9 @@ iolooper_is_write( IoLooper* iol, int fd )
{
return FD_ISSET(fd, iol->writes_result);
}
+
+int
+iolooper_has_operations( IoLooper* iol )
+{
+ return iolooper_fd_count(iol) > 0;
+}
diff --git a/iolooper.h b/iolooper.h
index ead3583..2822f71 100644
--- a/iolooper.h
+++ b/iolooper.h
@@ -21,5 +21,7 @@ int iolooper_wait( IoLooper* iol, int64_t duration );
int iolooper_is_read( IoLooper* iol, int fd );
int iolooper_is_write( IoLooper* iol, int fd );
+/* Returns 1 if this IoLooper has one or more file descriptor to interact with */
+int iolooper_has_operations( IoLooper* iol );
#endif /* IOLOOPER_H */