mirror of https://github.com/xemu-project/xemu.git
block-coroutine-wrapper.py: support also basic return types
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>
This commit is contained in:
parent
0582fb8293
commit
6700dfb1b8
|
@ -32,18 +32,15 @@
|
||||||
typedef struct BdrvPollCo {
|
typedef struct BdrvPollCo {
|
||||||
AioContext *ctx;
|
AioContext *ctx;
|
||||||
bool in_progress;
|
bool in_progress;
|
||||||
int ret;
|
|
||||||
Coroutine *co; /* Keep pointer here for debugging */
|
Coroutine *co; /* Keep pointer here for debugging */
|
||||||
} BdrvPollCo;
|
} BdrvPollCo;
|
||||||
|
|
||||||
static inline int bdrv_poll_co(BdrvPollCo *s)
|
static inline void bdrv_poll_co(BdrvPollCo *s)
|
||||||
{
|
{
|
||||||
assert(!qemu_in_coroutine());
|
assert(!qemu_in_coroutine());
|
||||||
|
|
||||||
aio_co_enter(s->ctx, s->co);
|
aio_co_enter(s->ctx, s->co);
|
||||||
AIO_WAIT_WHILE(s->ctx, s->in_progress);
|
AIO_WAIT_WHILE(s->ctx, s->in_progress);
|
||||||
|
|
||||||
return s->ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* BLOCK_BLOCK_GEN_H */
|
#endif /* BLOCK_BLOCK_GEN_H */
|
||||||
|
|
|
@ -92,7 +92,8 @@ class FuncDecl:
|
||||||
|
|
||||||
|
|
||||||
# Match wrappers declared with a co_wrapper mark
|
# 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<variant>(_[a-z][a-z0-9_]*)?)\s*'
|
||||||
r'(?P<wrapper_name>[a-z][a-z0-9_]*)'
|
r'(?P<wrapper_name>[a-z][a-z0-9_]*)'
|
||||||
r'\((?P<args>[^)]*)\);$', re.MULTILINE)
|
r'\((?P<args>[^)]*)\);$', re.MULTILINE)
|
||||||
|
@ -100,7 +101,7 @@ func_decl_re = re.compile(r'^int\s*co_wrapper'
|
||||||
|
|
||||||
def func_decl_iter(text: str) -> Iterator:
|
def func_decl_iter(text: str) -> Iterator:
|
||||||
for m in func_decl_re.finditer(text):
|
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'),
|
name=m.group('wrapper_name'),
|
||||||
args=m.group('args'),
|
args=m.group('args'),
|
||||||
variant=m.group('variant'))
|
variant=m.group('variant'))
|
||||||
|
@ -123,7 +124,7 @@ def create_mixed_wrapper(func: FuncDecl) -> str:
|
||||||
name = func.co_name
|
name = func.co_name
|
||||||
struct_name = func.struct_name
|
struct_name = func.struct_name
|
||||||
return f"""\
|
return f"""\
|
||||||
int {func.name}({ func.gen_list('{decl}') })
|
{func.return_type} {func.name}({ func.gen_list('{decl}') })
|
||||||
{{
|
{{
|
||||||
if (qemu_in_coroutine()) {{
|
if (qemu_in_coroutine()) {{
|
||||||
return {name}({ func.gen_list('{name}') });
|
return {name}({ func.gen_list('{name}') });
|
||||||
|
@ -137,7 +138,8 @@ int {func.name}({ func.gen_list('{decl}') })
|
||||||
|
|
||||||
s.poll_state.co = qemu_coroutine_create({name}_entry, &s);
|
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;
|
||||||
}}
|
}}
|
||||||
}}"""
|
}}"""
|
||||||
|
|
||||||
|
@ -149,7 +151,7 @@ def create_co_wrapper(func: FuncDecl) -> str:
|
||||||
name = func.co_name
|
name = func.co_name
|
||||||
struct_name = func.struct_name
|
struct_name = func.struct_name
|
||||||
return f"""\
|
return f"""\
|
||||||
int {func.name}({ func.gen_list('{decl}') })
|
{func.return_type} {func.name}({ func.gen_list('{decl}') })
|
||||||
{{
|
{{
|
||||||
{struct_name} s = {{
|
{struct_name} s = {{
|
||||||
.poll_state.ctx = {func.ctx},
|
.poll_state.ctx = {func.ctx},
|
||||||
|
@ -161,13 +163,13 @@ int {func.name}({ func.gen_list('{decl}') })
|
||||||
|
|
||||||
s.poll_state.co = qemu_coroutine_create({name}_entry, &s);
|
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:
|
def gen_wrapper(func: FuncDecl) -> str:
|
||||||
assert not '_co_' in func.name
|
assert not '_co_' in func.name
|
||||||
assert func.return_type == 'int'
|
|
||||||
|
|
||||||
name = func.co_name
|
name = func.co_name
|
||||||
struct_name = func.struct_name
|
struct_name = func.struct_name
|
||||||
|
@ -183,6 +185,7 @@ def gen_wrapper(func: FuncDecl) -> str:
|
||||||
|
|
||||||
typedef struct {struct_name} {{
|
typedef struct {struct_name} {{
|
||||||
BdrvPollCo poll_state;
|
BdrvPollCo poll_state;
|
||||||
|
{func.return_type} ret;
|
||||||
{ func.gen_block(' {decl};') }
|
{ func.gen_block(' {decl};') }
|
||||||
}} {struct_name};
|
}} {struct_name};
|
||||||
|
|
||||||
|
@ -190,7 +193,7 @@ static void coroutine_fn {name}_entry(void *opaque)
|
||||||
{{
|
{{
|
||||||
{struct_name} *s = 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;
|
s->poll_state.in_progress = false;
|
||||||
|
|
||||||
aio_wait_kick();
|
aio_wait_kick();
|
||||||
|
|
Loading…
Reference in New Issue