Skip to content

Commit

Permalink
block-coroutine-wrapper.py: support also basic return types
Browse files Browse the repository at this point in the history
Extend the regex to cover also return type, pointers included.
This implies that the value returned by the function cannot be
a simple "int" anymore, but the custom return type.
Therefore remove poll_state->ret and instead use a per-function
custom "ret" field.

Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Message-Id: <20221128142337.657646-13-eesposit@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
esposem authored and kevmw committed Dec 15, 2022
1 parent 0582fb8 commit 6700dfb
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 12 deletions.
5 changes: 1 addition & 4 deletions block/block-gen.h
Expand Up @@ -32,18 +32,15 @@
typedef struct BdrvPollCo {
AioContext *ctx;
bool in_progress;
int ret;
Coroutine *co; /* Keep pointer here for debugging */
} BdrvPollCo;

static inline int bdrv_poll_co(BdrvPollCo *s)
static inline void bdrv_poll_co(BdrvPollCo *s)
{
assert(!qemu_in_coroutine());

aio_co_enter(s->ctx, s->co);
AIO_WAIT_WHILE(s->ctx, s->in_progress);

return s->ret;
}

#endif /* BLOCK_BLOCK_GEN_H */
19 changes: 11 additions & 8 deletions scripts/block-coroutine-wrapper.py
Expand Up @@ -92,15 +92,16 @@ def gen_block(self, format: str) -> str:


# Match wrappers declared with a co_wrapper mark
func_decl_re = re.compile(r'^int\s*co_wrapper'
func_decl_re = re.compile(r'^(?P<return_type>[a-zA-Z][a-zA-Z0-9_]* [\*]?)'
r'\s*co_wrapper'
r'(?P<variant>(_[a-z][a-z0-9_]*)?)\s*'
r'(?P<wrapper_name>[a-z][a-z0-9_]*)'
r'\((?P<args>[^)]*)\);$', re.MULTILINE)


def func_decl_iter(text: str) -> Iterator:
for m in func_decl_re.finditer(text):
yield FuncDecl(return_type='int',
yield FuncDecl(return_type=m.group('return_type'),
name=m.group('wrapper_name'),
args=m.group('args'),
variant=m.group('variant'))
Expand All @@ -123,7 +124,7 @@ def create_mixed_wrapper(func: FuncDecl) -> str:
name = func.co_name
struct_name = func.struct_name
return f"""\
int {func.name}({ func.gen_list('{decl}') })
{func.return_type} {func.name}({ func.gen_list('{decl}') })
{{
if (qemu_in_coroutine()) {{
return {name}({ func.gen_list('{name}') });
Expand All @@ -137,7 +138,8 @@ def create_mixed_wrapper(func: FuncDecl) -> str:
s.poll_state.co = qemu_coroutine_create({name}_entry, &s);
return bdrv_poll_co(&s.poll_state);
bdrv_poll_co(&s.poll_state);
return s.ret;
}}
}}"""

Expand All @@ -149,7 +151,7 @@ def create_co_wrapper(func: FuncDecl) -> str:
name = func.co_name
struct_name = func.struct_name
return f"""\
int {func.name}({ func.gen_list('{decl}') })
{func.return_type} {func.name}({ func.gen_list('{decl}') })
{{
{struct_name} s = {{
.poll_state.ctx = {func.ctx},
Expand All @@ -161,13 +163,13 @@ def create_co_wrapper(func: FuncDecl) -> str:
s.poll_state.co = qemu_coroutine_create({name}_entry, &s);
return bdrv_poll_co(&s.poll_state);
bdrv_poll_co(&s.poll_state);
return s.ret;
}}"""


def gen_wrapper(func: FuncDecl) -> str:
assert not '_co_' in func.name
assert func.return_type == 'int'

name = func.co_name
struct_name = func.struct_name
Expand All @@ -183,14 +185,15 @@ def gen_wrapper(func: FuncDecl) -> str:
typedef struct {struct_name} {{
BdrvPollCo poll_state;
{func.return_type} ret;
{ func.gen_block(' {decl};') }
}} {struct_name};
static void coroutine_fn {name}_entry(void *opaque)
{{
{struct_name} *s = opaque;
s->poll_state.ret = {name}({ func.gen_list('s->{name}') });
s->ret = {name}({ func.gen_list('s->{name}') });
s->poll_state.in_progress = false;
aio_wait_kick();
Expand Down

0 comments on commit 6700dfb

Please sign in to comment.