diff options
author | Kevin Wolf <kwolf@redhat.com> | 2009-10-22 17:54:35 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-10-27 12:28:58 -0500 |
commit | 59c7b155aa6e1cbfe8a92e2322ea59ab31965c10 (patch) | |
tree | 1cf5e12345942d6512724a8f418fb7c4849321c1 /posix-aio-compat.c | |
parent | 18f3a5151cfdc659459faf70cd09d5c887f7addc (diff) | |
download | hqemu-59c7b155aa6e1cbfe8a92e2322ea59ab31965c10.zip hqemu-59c7b155aa6e1cbfe8a92e2322ea59ab31965c10.tar.gz |
posix-aio-compat: Split out posix_aio_process_queue
We need to process the request queue and run callbacks separately from reading
out the queue in a later patch, so split it out.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'posix-aio-compat.c')
-rw-r--r-- | posix-aio-compat.c | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/posix-aio-compat.c b/posix-aio-compat.c index 400d898..e9f789c 100644 --- a/posix-aio-compat.c +++ b/posix-aio-compat.c @@ -413,36 +413,25 @@ static int qemu_paio_error(struct qemu_paiocb *aiocb) return ret; } -static void posix_aio_read(void *opaque) +static int posix_aio_process_queue(void *opaque) { PosixAioState *s = opaque; struct qemu_paiocb *acb, **pacb; int ret; - ssize_t len; - - /* read all bytes from signal pipe */ - for (;;) { - char bytes[16]; - - len = read(s->rfd, bytes, sizeof(bytes)); - if (len == -1 && errno == EINTR) - continue; /* try again */ - if (len == sizeof(bytes)) - continue; /* more to read */ - break; - } + int result = 0; for(;;) { pacb = &s->first_aio; for(;;) { acb = *pacb; if (!acb) - goto the_end; + return result; ret = qemu_paio_error(acb); if (ret == ECANCELED) { /* remove the request */ *pacb = acb->next; qemu_aio_release(acb); + result = 1; } else if (ret != EINPROGRESS) { /* end of aio */ if (ret == 0) { @@ -459,13 +448,35 @@ static void posix_aio_read(void *opaque) /* call the callback */ acb->common.cb(acb->common.opaque, ret); qemu_aio_release(acb); + result = 1; break; } else { pacb = &acb->next; } } } - the_end: ; + + return result; +} + +static void posix_aio_read(void *opaque) +{ + PosixAioState *s = opaque; + ssize_t len; + + /* read all bytes from signal pipe */ + for (;;) { + char bytes[16]; + + len = read(s->rfd, bytes, sizeof(bytes)); + if (len == -1 && errno == EINTR) + continue; /* try again */ + if (len == sizeof(bytes)) + continue; /* more to read */ + break; + } + + posix_aio_process_queue(s); } static int posix_aio_flush(void *opaque) |