On Wed, Feb 20, 2019 at 01:03:58PM +0300, Vladimir Sementsov-Ogievskiy wrote: > Hi all! > > We have a very frequent pattern of creating coroutine from function > with several arguments: > > - create structure to pack parameters > - create _entry function to call original function taking parameters > from struct > - do different magic to handle completion: set ret to NOT_DONE or > EINPROGRESS, use separate bool for void functions > - fill the struct and create coroutine from _entry function and this > struct as a parameter > > Here is a template code + example how it can be used to drop a lot of > similar code. > > TODO: make coroutine-wrapper template file to be header itself, or > generate header from it
Yes, please. For example, block/coroutines.h:
#include "block/block.h"
int coroutine_fn bdrv_co_check(BlockDriverState *bs,
BdrvCheckResult *res, BdrvCheckMode fix);
void coroutine_fn bdrv_co_invalidate_cache(BlockDriverState *bs, Error
**errp);
Now include/block/block.h doesn't need to be modified and these
coroutine function prototypes stay private to the block layer (they are
not in include/).
The code generator script can parse coroutines.h to generate
__create_co() functions. This also makes the tool independent of the
block layer - the output C file just needs to include the input header
file:
/*
* File is generated by scripts/coroutine-wrapper.py
*/
#include "qemu/osdep.h"
#include "block/coroutines.h" <--- from coroutine-wrapper command-line
...
signature.asc
Description: PGP signature
