| ======================= | 
 | block-coroutine-wrapper | 
 | ======================= | 
 |  | 
 | A lot of functions in QEMU block layer (see ``block/*``) can only be | 
 | called in coroutine context. Such functions are normally marked by the | 
 | coroutine_fn specifier. Still, sometimes we need to call them from | 
 | non-coroutine context; for this we need to start a coroutine, run the | 
 | needed function from it and wait for the coroutine to finish in a | 
 | BDRV_POLL_WHILE() loop. To run a coroutine we need a function with one | 
 | void* argument. So for each coroutine_fn function which needs a | 
 | non-coroutine interface, we should define a structure to pack the | 
 | parameters, define a separate function to unpack the parameters and | 
 | call the original function and finally define a new interface function | 
 | with same list of arguments as original one, which will pack the | 
 | parameters into a struct, create a coroutine, run it and wait in | 
 | BDRV_POLL_WHILE() loop. It's boring to create such wrappers by hand, | 
 | so we have a script to generate them. | 
 |  | 
 | Usage | 
 | ===== | 
 |  | 
 | Assume we have defined the ``coroutine_fn`` function | 
 | ``bdrv_co_foo(<some args>)`` and need a non-coroutine interface for it, | 
 | called ``bdrv_foo(<same args>)``. In this case the script can help. To | 
 | trigger the generation: | 
 |  | 
 | 1. You need ``bdrv_foo`` declaration somewhere (for example, in | 
 |    ``block/coroutines.h``) with the ``co_wrapper`` mark, | 
 |    like this: | 
 |  | 
 | .. code-block:: c | 
 |  | 
 |     int co_wrapper bdrv_foo(<some args>); | 
 |  | 
 | 2. You need to feed this declaration to block-coroutine-wrapper script. | 
 |    For this, add the .h (or .c) file with the declaration to the | 
 |    ``input: files(...)`` list of ``block_gen_c`` target declaration in | 
 |    ``block/meson.build`` | 
 |  | 
 | You are done. During the build, coroutine wrappers will be generated in | 
 | ``<BUILD_DIR>/block/block-gen.c``. | 
 |  | 
 | Links | 
 | ===== | 
 |  | 
 | 1. The script location is ``scripts/block-coroutine-wrapper.py``. | 
 |  | 
 | 2. Generic place for private ``co_wrapper`` declarations is | 
 |    ``block/coroutines.h``, for public declarations: | 
 |    ``include/block/block.h`` | 
 |  | 
 | 3. The core API of generated coroutine wrappers is placed in | 
 |    (not generated) ``block/block-gen.h`` |