aboutsummaryrefslogtreecommitdiffstats
path: root/aio-android.c
diff options
context:
space:
mode:
authorDavid Turner <digit@android.com>2010-09-10 00:21:05 +0200
committerDavid 'Digit' Turner <digit@android.com>2010-09-13 00:30:34 -0700
commit7627ed7924456c88d3e8631c2cddcc7d54107ffa (patch)
treec9496d72e0ac02932bd6d0ab548fa9f924fd3452 /aio-android.c
parentedd33969474fd39ed2aa61f4b07b83ee3e586f9c (diff)
downloadexternal_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.c36
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 {