From 7627ed7924456c88d3e8631c2cddcc7d54107ffa Mon Sep 17 00:00:00 2001 From: David Turner Date: Fri, 10 Sep 2010 00:21:05 +0200 Subject: upstream: aio --- aio.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'aio.c') diff --git a/aio.c b/aio.c index 2f3f8e7..2f08655 100644 --- a/aio.c +++ b/aio.c @@ -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; } @@ -110,9 +113,31 @@ void qemu_aio_flush(void) qemu_aio_wait(); QLIST_FOREACH(node, &aio_handlers, node) { - ret |= node->io_flush(node->opaque); + if (node->io_flush) { + ret |= node->io_flush(node->opaque); + } } - } while (ret > 0); + } 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) @@ -122,6 +147,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; -- cgit v1.1