static int posix_aio_process_queue(void *opaque)

{

    PosixAioState *s = opaque;

    struct qemu_paiocb *acb, **pacb;

    int ret;

    int result = 0;

    int async_context_id = get_async_context_id();



    for(;;) {

        pacb = &s->first_aio;

        for(;;) {

            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 */

                *pacb = acb->next;

                qemu_aio_release(acb);

                result = 1;

            } else if (ret != EINPROGRESS) {

                /* end of aio */

                if (ret == 0) {

                    ret = qemu_paio_return(acb);

                    if (ret == acb->aio_nbytes)

                        ret = 0;

                    else

                        ret = -EINVAL;

                } else {

                    ret = -ret;

                }



                trace_paio_complete(acb, acb->common.opaque, ret);



                /* remove the request */

                *pacb = acb->next;

                /* call the callback */

                acb->common.cb(acb->common.opaque, ret);

                qemu_aio_release(acb);

                result = 1;

                break;

            } else {

                pacb = &acb->next;

            }

        }

    }



    return result;

}

static int posix_aio_process_queue(void *opaque)

{

    PosixAioState *s = opaque;

    struct qemu_paiocb *acb, **pacb;

    int ret;

    int result = 0;

    int async_context_id = get_async_context_id();



    for(;;) {

        pacb = &s->first_aio;

        for(;;) {

            acb = *pacb;

            if (!acb)

                return result;



            

            if (acb->async_context_id != async_context_id) {

                pacb = &acb->next;

                continue;

            }



            ret = qemu_paio_error(acb);

            if (ret == ECANCELED) {

                

                *pacb = acb->next;

                qemu_aio_release(acb);

                result = 1;

            } else if (ret != EINPROGRESS) {

                

                if (ret == 0) {

                    ret = qemu_paio_return(acb);

                    if (ret == acb->aio_nbytes)

                        ret = 0;

                    else

                        ret = -EINVAL;

                } else {

                    ret = -ret;

                }



                trace_paio_complete(acb, acb->common.opaque, ret);



                

                *pacb = acb->next;

                

                acb->common.cb(acb->common.opaque, ret);

                qemu_aio_release(acb);

                result = 1;

                break;

            } else {

                pacb = &acb->next;

            }

        }

    }



    return result;

}

static int FUNC_0(void *VAR_0)

{

    PosixAioState *s = VAR_0;

    struct qemu_paiocb *VAR_1, **VAR_2;

    int VAR_3;

    int VAR_4 = 0;

    int VAR_5 = get_async_context_id();



    for(;;) {

        VAR_2 = &s->first_aio;

        for(;;) {

            VAR_1 = *VAR_2;

            if (!VAR_1)

                return VAR_4;



            

            if (VAR_1->VAR_5 != VAR_5) {

                VAR_2 = &VAR_1->next;

                continue;

            }



            VAR_3 = qemu_paio_error(VAR_1);

            if (VAR_3 == ECANCELED) {

                

                *VAR_2 = VAR_1->next;

                qemu_aio_release(VAR_1);

                VAR_4 = 1;

            } else if (VAR_3 != EINPROGRESS) {

                

                if (VAR_3 == 0) {

                    VAR_3 = qemu_paio_return(VAR_1);

                    if (VAR_3 == VAR_1->aio_nbytes)

                        VAR_3 = 0;

                    else

                        VAR_3 = -EINVAL;

                } else {

                    VAR_3 = -VAR_3;

                }



                trace_paio_complete(VAR_1, VAR_1->common.VAR_0, VAR_3);



                

                *VAR_2 = VAR_1->next;

                

                VAR_1->common.cb(VAR_1->common.VAR_0, VAR_3);

                qemu_aio_release(VAR_1);

                VAR_4 = 1;

                break;

            } else {

                VAR_2 = &VAR_1->next;

            }

        }

    }



    return VAR_4;

}

static int FUNC_0(void *VAR_0)
{ PosixAioState *s = VAR_0; struct qemu_paiocb *VAR_1, **VAR_2; int VAR_3; int VAR_4 = 0; int VAR_5 = get_async_context_id(); for(;;) { VAR_2 = &s->first_aio; for(;;) { VAR_1 = *VAR_2; if (!VAR_1)
return VAR_4; if (VAR_1->VAR_5 != VAR_5) { VAR_2 = &VAR_1->next; continue; } VAR_3 = qemu_paio_error(VAR_1); if (VAR_3 == ECANCELED) { *VAR_2 = VAR_1->next; qemu_aio_release(VAR_1); VAR_4 = 1; } else if (VAR_3 != EINPROGRESS) { if (VAR_3 == 0) { VAR_3 = qemu_paio_return(VAR_1); if (VAR_3 == VAR_1->aio_nbytes)
VAR_3 = 0; else
VAR_3 = -EINVAL; } else { VAR_3 = -VAR_3; } trace_paio_complete(VAR_1, VAR_1->common.VAR_0, VAR_3); *VAR_2 = VAR_1->next; VAR_1->common.cb(VAR_1->common.VAR_0, VAR_3); qemu_aio_release(VAR_1); VAR_4 = 1; break; } else { VAR_2 = &VAR_1->next; } } } return VAR_4; }