diff options
author | Ot ten Thije <ottenthije@google.com> | 2010-07-19 13:10:18 +0100 |
---|---|---|
committer | Ot ten Thije <ottenthije@google.com> | 2010-07-28 09:39:07 +0100 |
commit | cc19d3eeef59cbd354c1c618f7421d6fe5e0a098 (patch) | |
tree | 3e5d5b38c9be72c8013b1efbd1897e6792110795 | |
parent | 2fa5173bd1ce7341c50adac676a317945f0969c7 (diff) | |
download | external_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.c | 5 | ||||
-rw-r--r-- | iolooper-select.c | 6 | ||||
-rw-r--r-- | iolooper.h | 2 |
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; +} @@ -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 */ |