diff options
author | David Turner <digit@android.com> | 2010-09-10 00:21:05 +0200 |
---|---|---|
committer | David 'Digit' Turner <digit@android.com> | 2010-09-13 00:30:34 -0700 |
commit | 7627ed7924456c88d3e8631c2cddcc7d54107ffa (patch) | |
tree | c9496d72e0ac02932bd6d0ab548fa9f924fd3452 /aio-android.c | |
parent | edd33969474fd39ed2aa61f4b07b83ee3e586f9c (diff) | |
download | external_qemu-7627ed7924456c88d3e8631c2cddcc7d54107ffa.zip external_qemu-7627ed7924456c88d3e8631c2cddcc7d54107ffa.tar.gz external_qemu-7627ed7924456c88d3e8631c2cddcc7d54107ffa.tar.bz2 |
upstream: aio
Diffstat (limited to 'aio-android.c')
-rw-r--r-- | aio-android.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/aio-android.c b/aio-android.c index 2b67579..be0e769 100644 --- a/aio-android.c +++ b/aio-android.c @@ -34,6 +34,7 @@ struct AioHandler IOHandler *io_read; IOHandler *io_write; AioFlushHandler *io_flush; + AioProcessQueue *io_process_queue; int deleted; void *opaque; QLIST_ENTRY(AioHandler) node; @@ -56,6 +57,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; @@ -88,6 +90,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; } @@ -111,9 +114,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) @@ -124,6 +149,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; + looper = iolooper_new(); do { |