On Tue, Nov 21, 2017 at 12:13:46AM +0100, Paolo Bonzini wrote: > On 21/11/2017 00:08, Jeff Cody wrote: > > @@ -34,6 +36,7 @@ void coroutine_fn co_aio_sleep_ns(AioContext *ctx, > > QEMUClockType type, > > CoSleepCB sleep_cb = { > > .co = qemu_coroutine_self(), > > }; > > + if (sleep_cb.co->sleeping == 1 || sleep_cb.co->scheduled == 1) { > > + fprintf(stderr, "Cannot sleep a co-routine that is already sleeping > > " > > + " or scheduled\n"); > > + abort(); > > + } > > + sleep_cb.co->sleeping = 1; > > sleep_cb.ts = aio_timer_new(ctx, type, SCALE_NS, co_sleep_cb, > > &sleep_cb); > > timer_mod(sleep_cb.ts, qemu_clock_get_ns(type) + ns); > > qemu_coroutine_yield(); > > I understand that this was just an example and not the actual patch, but > I'll still point out that this loses the benefit (better error message) > of keeping the flags separate. > > What do you think about making "scheduled" a const char * and assigning > __func__ to it (i.e. either "aio_co_schedule" or "co_aio_sleep_ns")? >
Ohhh, nice. I'll spin a v2 with that, and merge patches 3 and 5 together. And then maybe for 2.12 we can look at making it a fsm, like Stefan suggested (or somehow make coroutine entry thread safe and idempotent). Jeff