aio: add aio_context_acquire() and aio_context_release()
authorStefan Hajnoczi <stefanha@redhat.com>
Mon, 3 Mar 2014 10:30:04 +0000 (11:30 +0100)
committerStefan Hajnoczi <stefanha@redhat.com>
Thu, 13 Mar 2014 13:42:24 +0000 (14:42 +0100)
commit98563fc3ec44c1becce6f1720ad6b0a82ed101b4
tree18adf9c0239707158d5f95ef2e0702c5eeaa29b8
parent2da61b671eb89fcaa306738f44eed472977d6587
aio: add aio_context_acquire() and aio_context_release()

It can be useful to run an AioContext from a thread which normally does
not "own" the AioContext.  For example, request draining can be
implemented by acquiring the AioContext and looping aio_poll() until all
requests have been completed.

The following pattern should work:

  /* Event loop thread */
  while (running) {
      aio_context_acquire(ctx);
      aio_poll(ctx, true);
      aio_context_release(ctx);
  }

  /* Another thread */
  aio_context_acquire(ctx);
  bdrv_read(bs, 0x1000, buf, 1);
  aio_context_release(ctx);

This patch implements aio_context_acquire() and aio_context_release().

Note that existing aio_poll() callers do not need to worry about
acquiring and releasing - it is only needed when multiple threads will
call aio_poll() on the same AioContext.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
async.c
include/block/aio.h
tests/test-aio.c