Vladimir Sementsov-Ogievskiy <[email protected]> writes:
> If we have current monitor, let's bind it to wrapper coroutine too.
>
> Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>
> ---
> 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;
> }