diff options
author | Kevin Wolf <kwolf@redhat.com> | 2009-10-22 17:54:36 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-10-27 12:28:59 -0500 |
commit | 1f76aceebf3a8ed9d4d54df443c09c578562752e (patch) | |
tree | a1f01f36d5dfcf3b437b323540bb844fd9825f16 /aio.c | |
parent | 37e52a9f0690e727c863aeac9ddbb711c8e929b7 (diff) | |
download | qemu-1f76aceebf3a8ed9d4d54df443c09c578562752e.tar.gz qemu-1f76aceebf3a8ed9d4d54df443c09c578562752e.tar.bz2 qemu-1f76aceebf3a8ed9d4d54df443c09c578562752e.zip |
Add qemu_aio_process_queue()
We'll leave some AIO completions unhandled when we can't call the callback.
qemu_aio_process_queue() is used later to run any callbacks that are left and
can be run then.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'aio.c')
-rw-r--r-- | aio.c | 30 |
1 files changed, 30 insertions, 0 deletions
@@ -33,6 +33,7 @@ struct AioHandler IOHandler *io_read; IOHandler *io_write; AioFlushHandler *io_flush; + AioProcessQueue *io_process_queue; int deleted; void *opaque; QLIST_ENTRY(AioHandler) node; @@ -55,6 +56,7 @@ int qemu_aio_set_fd_handler(int fd, IOHandler *io_read, IOHandler *io_write, AioFlushHandler *io_flush, + AioProcessQueue *io_process_queue, void *opaque) { AioHandler *node; @@ -87,6 +89,7 @@ int qemu_aio_set_fd_handler(int fd, node->io_read = io_read; node->io_write = io_write; node->io_flush = io_flush; + node->io_process_queue = io_process_queue; node->opaque = opaque; } @@ -115,6 +118,26 @@ void qemu_aio_flush(void) } while (qemu_bh_poll() || ret > 0); } +int qemu_aio_process_queue(void) +{ + AioHandler *node; + int ret = 0; + + walking_handlers = 1; + + QLIST_FOREACH(node, &aio_handlers, node) { + if (node->io_process_queue) { + if (node->io_process_queue(node->opaque)) { + ret = 1; + } + } + } + + walking_handlers = 0; + + return ret; +} + void qemu_aio_wait(void) { int ret; @@ -122,6 +145,13 @@ void qemu_aio_wait(void) if (qemu_bh_poll()) return; + /* + * If there are callbacks left that have been queued, we need to call then. + * Return afterwards to avoid waiting needlessly in select(). + */ + if (qemu_aio_process_queue()) + return; + do { AioHandler *node; fd_set rdfds, wrfds; |