The Wednesday 03 Sep 2014 à 19:23:36 (+0800), Fam Zheng wrote : > This will be useful in synchronous cancel emulation with > bdrv_aio_cancel_async. > > Signed-off-by: Fam Zheng <f...@redhat.com> > --- > block.c | 12 +++++++++++- > include/block/aio.h | 2 ++ > 2 files changed, 13 insertions(+), 1 deletion(-) > > diff --git a/block.c b/block.c > index cb670fd..78d68cb 100644 > --- a/block.c > +++ b/block.c > @@ -4885,13 +4885,23 @@ void *qemu_aio_get(const AIOCBInfo *aiocb_info, > BlockDriverState *bs, > acb->bs = bs; > acb->cb = cb; > acb->opaque = opaque; > + acb->refcnt = 1; > return acb; > } > > +void qemu_aio_ref(void *p) > +{ > + BlockDriverAIOCB *acb = p; > + acb->refcnt++; > +}
> + > void qemu_aio_release(void *p) I would expect _release to change to _unref for symetry. > { > BlockDriverAIOCB *acb = p; > - g_slice_free1(acb->aiocb_info->aiocb_size, acb); > + assert(acb->refcnt > 0); > + if (--acb->refcnt == 0) { > + g_slice_free1(acb->aiocb_info->aiocb_size, acb); > + } > } > > /**************************************************************/ > diff --git a/include/block/aio.h b/include/block/aio.h > index 4603c0f..2626fc7 100644 > --- a/include/block/aio.h > +++ b/include/block/aio.h > @@ -35,11 +35,13 @@ struct BlockDriverAIOCB { > BlockDriverState *bs; > BlockDriverCompletionFunc *cb; > void *opaque; > + int refcnt; > }; > > void *qemu_aio_get(const AIOCBInfo *aiocb_info, BlockDriverState *bs, > BlockDriverCompletionFunc *cb, void *opaque); > void qemu_aio_release(void *p); > +void qemu_aio_ref(void *p); > > typedef struct AioHandler AioHandler; > typedef void QEMUBHFunc(void *opaque); > -- > 2.1.0.27.g96db324 >