diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2012-04-12 14:00:56 +0200 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2012-04-19 16:51:47 +0200 |
commit | 9eb0bfca960b8cf24fb42e017c3a6479e5676f75 (patch) | |
tree | c2c6d849041b2f0dbe66b0777f8e8bcbe9b2ad73 | |
parent | bcdc18578d5b41180db2e17baa7563c5f05b39ee (diff) | |
download | qemu-9eb0bfca960b8cf24fb42e017c3a6479e5676f75.zip qemu-9eb0bfca960b8cf24fb42e017c3a6479e5676f75.tar.gz qemu-9eb0bfca960b8cf24fb42e017c3a6479e5676f75.tar.bz2 |
aio: simplify qemu_aio_wait
The do...while loop can never loop, because select will just not return
0 when invoked with infinite timeout.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r-- | aio.c | 133 |
1 files changed, 64 insertions, 69 deletions
@@ -104,7 +104,11 @@ void qemu_aio_flush(void) bool qemu_aio_wait(void) { + AioHandler *node; + fd_set rdfds, wrfds; + int max_fd = -1; int ret; + bool busy; /* * If there are callbacks left that have been queued, we need to call then. @@ -115,85 +119,76 @@ bool qemu_aio_wait(void) return true; } - do { - AioHandler *node; - fd_set rdfds, wrfds; - bool busy; - int max_fd = -1; + walking_handlers = 1; - walking_handlers = 1; + FD_ZERO(&rdfds); + FD_ZERO(&wrfds); - FD_ZERO(&rdfds); - FD_ZERO(&wrfds); - - /* fill fd sets */ - busy = false; - QLIST_FOREACH(node, &aio_handlers, node) { - /* If there aren't pending AIO operations, don't invoke callbacks. - * Otherwise, if there are no AIO requests, qemu_aio_wait() would - * wait indefinitely. - */ - if (node->io_flush) { - if (node->io_flush(node->opaque) == 0) { - continue; - } - busy = true; - } - if (!node->deleted && node->io_read) { - FD_SET(node->fd, &rdfds); - max_fd = MAX(max_fd, node->fd + 1); - } - if (!node->deleted && node->io_write) { - FD_SET(node->fd, &wrfds); - max_fd = MAX(max_fd, node->fd + 1); + /* fill fd sets */ + busy = false; + QLIST_FOREACH(node, &aio_handlers, node) { + /* If there aren't pending AIO operations, don't invoke callbacks. + * Otherwise, if there are no AIO requests, qemu_aio_wait() would + * wait indefinitely. + */ + if (node->io_flush) { + if (node->io_flush(node->opaque) == 0) { + continue; } + busy = true; + } + if (!node->deleted && node->io_read) { + FD_SET(node->fd, &rdfds); + max_fd = MAX(max_fd, node->fd + 1); } + if (!node->deleted && node->io_write) { + FD_SET(node->fd, &wrfds); + max_fd = MAX(max_fd, node->fd + 1); + } + } - walking_handlers = 0; + walking_handlers = 0; - /* No AIO operations? Get us out of here */ - if (!busy) { - return false; - } + /* No AIO operations? Get us out of here */ + if (!busy) { + return false; + } - /* wait until next event */ - ret = select(max_fd, &rdfds, &wrfds, NULL, NULL); - if (ret == -1 && errno == EINTR) - continue; - - /* if we have any readable fds, dispatch event */ - if (ret > 0) { - walking_handlers = 1; - - /* we have to walk very carefully in case - * qemu_aio_set_fd_handler is called while we're walking */ - node = QLIST_FIRST(&aio_handlers); - while (node) { - AioHandler *tmp; - - if (!node->deleted && - FD_ISSET(node->fd, &rdfds) && - node->io_read) { - node->io_read(node->opaque); - } - if (!node->deleted && - FD_ISSET(node->fd, &wrfds) && - node->io_write) { - node->io_write(node->opaque); - } - - tmp = node; - node = QLIST_NEXT(node, node); - - if (tmp->deleted) { - QLIST_REMOVE(tmp, node); - g_free(tmp); - } + /* wait until next event */ + ret = select(max_fd, &rdfds, &wrfds, NULL, NULL); + + /* if we have any readable fds, dispatch event */ + if (ret > 0) { + walking_handlers = 1; + + /* we have to walk very carefully in case + * qemu_aio_set_fd_handler is called while we're walking */ + node = QLIST_FIRST(&aio_handlers); + while (node) { + AioHandler *tmp; + + if (!node->deleted && + FD_ISSET(node->fd, &rdfds) && + node->io_read) { + node->io_read(node->opaque); + } + if (!node->deleted && + FD_ISSET(node->fd, &wrfds) && + node->io_write) { + node->io_write(node->opaque); } - walking_handlers = 0; + tmp = node; + node = QLIST_NEXT(node, node); + + if (tmp->deleted) { + QLIST_REMOVE(tmp, node); + g_free(tmp); + } } - } while (ret == 0); + + walking_handlers = 0; + } return true; } |