• Vladimir Sementsov-Ogievskiy's avatar
    scripts: add block-coroutine-wrapper.py · aaaa20b6
    Vladimir Sementsov-Ogievskiy authored
    We have a very frequent pattern of creating a coroutine from a function
    with several arguments:
      - create a 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 or use separate bool field
      - fill the struct and create coroutine from _entry function with this
        struct as a parameter
      - do coroutine enter and BDRV_POLL_WHILE loop
    Let's reduce code duplication by generating coroutine wrappers.
    This patch adds scripts/block-coroutine-wrapper.py together with some
    friends, which will generate functions with declared prototypes marked
    by the 'generated_co_wrapper' specifier.
    The usage of new code generation is as follows:
        1. define the coroutine function somewhere
            int coroutine_fn bdrv_co_NAME(...) {...}
        2. declare in some header file
            int generated_co_wrapper bdrv_NAME(...);
           with same list of parameters (generated_co_wrapper is
           defined in "include/block/block.h").
        3. Make sure the block_gen_c declaration in block/meson.build
           mentions the file with your marker function.
    Still, no function is now marked, this work is for the following
    Signed-off-by: Vladimir Sementsov-Ogievskiy's avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Reviewed-by: Eric Blake's avatarEric Blake <eblake@redhat.com>
    Message-Id: <20200924185414.28642-5-vsementsov@virtuozzo.com>
    [Added encoding='utf-8' to open() calls as requested by Vladimir. Fixed
    typo and grammar issues pointed out by Eric Blake. Removed clang-format
    dependency that caused build test issues.
    Signed-off-by: Stefan Hajnoczi's avatarStefan Hajnoczi <stefanha@redhat.com>
block-coroutine-wrapper.rst 2.07 KB