From: Kevin Wolf Date: Thu, 22 Oct 2009 15:54:40 +0000 (+0200) Subject: posix-aio-compat: Honour AsyncContext X-Git-Tag: TizenStudio_2.0_p2.3.2~208^2~9916 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e5f37649c670fdb212e83f376ed13d7f11804b17;p=sdk%2Femulator%2Fqemu.git posix-aio-compat: Honour AsyncContext Don't call callbacks that don't belong to the active AsyncContext. Signed-off-by: Kevin Wolf Signed-off-by: Anthony Liguori --- diff --git a/posix-aio-compat.c b/posix-aio-compat.c index 4901539..ec58288 100644 --- a/posix-aio-compat.c +++ b/posix-aio-compat.c @@ -48,6 +48,8 @@ struct qemu_paiocb { ssize_t ret; int active; struct qemu_paiocb *next; + + int async_context_id; }; typedef struct PosixAioState { @@ -419,6 +421,7 @@ static int posix_aio_process_queue(void *opaque) struct qemu_paiocb *acb, **pacb; int ret; int result = 0; + int async_context_id = get_async_context_id(); for(;;) { pacb = &s->first_aio; @@ -426,6 +429,13 @@ static int posix_aio_process_queue(void *opaque) acb = *pacb; if (!acb) return result; + + /* we're only interested in requests in the right context */ + if (acb->async_context_id != async_context_id) { + pacb = &acb->next; + continue; + } + ret = qemu_paio_error(acb); if (ret == ECANCELED) { /* remove the request */ @@ -558,6 +568,8 @@ BlockDriverAIOCB *paio_submit(BlockDriverState *bs, void *aio_ctx, int fd, acb->aio_type = type; acb->aio_fildes = fd; acb->ev_signo = SIGUSR2; + acb->async_context_id = get_async_context_id(); + if (qiov) { acb->aio_iov = qiov->iov; acb->aio_niov = qiov->niov;