On 10/02/2015 12:09, Kevin Wolf wrote:
>> > 
>> > 4 mutex->locked = false;
>> >   qemu_co_queue_next(&mutex->queue);
>> >    '--> qemu_co_queue_do_restart(queue, true);
>> >         '--> QTAILQ_REMOVE(&queue->entries, next, co_queue_next);
>> >              QTAILQ_INSERT_TAIL(&self->co_queue_wakeup, next, 
>> > co_queue_next);
>> > 
>> > 5 coroutine_swap(co1, leader, COROUTINE_YIELD);
>> > 
>> > And co2 is never reentered until co1 terminates.  Right?
> No, co2 will be reentered during the yield in line 5. However, it's not
> the yielding coroutine that reenters it but the parent, which is resumed
> at exactly the line of code that you quoted above.

So:

5 coroutine_swap(co1, leader, COROUTINE_YIELD);
  '--> jumps back to qemu_coroutine_switch
       '--> returns to qemu_coroutine_enter

  qemu_co_queue_run_restart(co);
  '--> QTAILQ_REMOVE(&co->co_queue_wakeup, next, co_queue_next);
       qemu_coroutine_enter(next, NULL);


Thanks for the explanation.  Series:

Reviewed-by: Paolo Bonzini <pbonz...@redhat.com>

Reply via email to