|
@@ -468,26 +468,37 @@ static int qemu_paio_error(struct qemu_paiocb *aiocb)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int posix_aio_process_queue(void *opaque)
|
|
|
+static void posix_aio_read(void *opaque)
|
|
|
{
|
|
|
PosixAioState *s = opaque;
|
|
|
struct qemu_paiocb *acb, **pacb;
|
|
|
int ret;
|
|
|
- int result = 0;
|
|
|
+ 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;
|
|
|
+ }
|
|
|
|
|
|
for(;;) {
|
|
|
pacb = &s->first_aio;
|
|
|
for(;;) {
|
|
|
acb = *pacb;
|
|
|
if (!acb)
|
|
|
- return result;
|
|
|
+ return;
|
|
|
|
|
|
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) {
|
|
@@ -507,35 +518,12 @@ static int posix_aio_process_queue(void *opaque)
|
|
|
/* call the callback */
|
|
|
acb->common.cb(acb->common.opaque, ret);
|
|
|
qemu_aio_release(acb);
|
|
|
- result = 1;
|
|
|
break;
|
|
|
} else {
|
|
|
pacb = &acb->next;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- 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)
|
|
@@ -676,7 +664,7 @@ int paio_init(void)
|
|
|
fcntl(s->wfd, F_SETFL, O_NONBLOCK);
|
|
|
|
|
|
qemu_aio_set_fd_handler(s->rfd, posix_aio_read, NULL, posix_aio_flush,
|
|
|
- posix_aio_process_queue, s);
|
|
|
+ NULL, s);
|
|
|
|
|
|
ret = pthread_attr_init(&attr);
|
|
|
if (ret)
|