[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 06/26] aio: simplify qemu_aio_wait
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 06/26] aio: simplify qemu_aio_wait |
Date: |
Thu, 12 Apr 2012 14:00:56 +0200 |
The do...while loop can never loop, because select will just not return
0 when invoked with infinite timeout.
Signed-off-by: Paolo Bonzini <address@hidden>
---
aio.c | 133 +++++++++++++++++++++++++++++++----------------------------------
1 file changed, 64 insertions(+), 69 deletions(-)
diff --git a/aio.c b/aio.c
index 5fcc0c6..0a9eb10 100644
--- a/aio.c
+++ b/aio.c
@@ -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;
}
--
1.7.9.3
- [Qemu-devel] [PATCH 00/26] My block patches queue for 1.1, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 01/26] qemu-io: use main_loop_wait, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 02/26] qemu-tool: map vm_clock to rt_clock, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 03/26] posix-aio: merge posix_aio_process_queue and posix_aio_read, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 05/26] aio: return "AIO in progress" state from qemu_aio_wait, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 04/26] aio: remove process_queue callback and qemu_aio_process_queue, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 07/26] block: add the support to drain throttled requests, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 08/26] block: add mode argument to blockdev-snapshot-sync, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 06/26] aio: simplify qemu_aio_wait,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 09/26] block: fail live snapshot if disk has no medium, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 10/26] block: fix snapshot on QED, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 14/26] block: fix allocation size for dirty bitmap, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 12/26] block: update in-memory backing file and format, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 11/26] block: push bdrv_change_backing_file error checking up from drivers, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 13/26] block: open backing file as read-only when probing for size, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 22/26] stream: do not copy unallocated sectors from the base, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 23/26] block: implement is_allocated for raw, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 24/26] stream: tweak usage of bdrv_co_is_allocated, Paolo Bonzini, 2012/04/12
- [Qemu-devel] [PATCH 16/26] qemu-io: correctly print non-integer values as decimals, Paolo Bonzini, 2012/04/12