Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> writes: > If we have current monitor, let's bind it to wrapper coroutine too. > > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> > --- > block/block-gen.h | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/block/block-gen.h b/block/block-gen.h > index c1fd3f40de..61f055a8cc 100644 > --- a/block/block-gen.h > +++ b/block/block-gen.h > @@ -27,6 +27,7 @@ > #define BLOCK_BLOCK_GEN_H > > #include "block/block_int.h" > +#include "monitor/monitor.h" > > /* Base structure for argument packing structures */ > typedef struct AioPollCo { > @@ -38,11 +39,20 @@ typedef struct AioPollCo { > > static inline int aio_poll_co(AioPollCo *s) > { > + Monitor *mon = monitor_cur();
This gets the currently executing coroutine's monitor from the hash table. > assert(!qemu_in_coroutine()); > > + if (mon) { > + monitor_set_cur(s->co, mon); This writes it back. No-op, since the coroutine hasn't changed. Why? > + } > + > aio_co_enter(s->ctx, s->co); > AIO_WAIT_WHILE(s->ctx, s->in_progress); > > + if (mon) { > + monitor_set_cur(s->co, NULL); This removes s->co's monitor from the hash table. Why? > + } > + > return s->ret; > }