Skip to content
Snippets Groups Projects
  • Vladimir Sementsov-Ogievskiy's avatar
    aaaa20b6
    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
    commit.
    
    Signed-off-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Reviewed-by: default 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.
    --Stefan]
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    aaaa20b6
    History
    scripts: add block-coroutine-wrapper.py
    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
    commit.
    
    Signed-off-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Reviewed-by: default 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.
    --Stefan]
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>