Am 22.06.2012 08:44, schrieb Peter A. G. Crosthwaite:
> The block layer assumes that it is the only user of coroutines -
> The qemu_in_coroutine() is used to determine if a function is in one of the
> block layers coroutines, which is flawed. I.E. If a client (e.g. a device or
> a machine model) of the block layer uses couroutine itself, the block layer
> will identify the callers coroutines as its own, and may falsely yield the
> calling coroutine (instead of creating its own to yield).
> 
> AFAICT, there are no conflicts in the QEMU master here yet, but its kind of an
> issue, as anyone who comes along and used coroutines and the block layer
> together is going to run into some very obscure and hard to debug race
> conditions.
> 
> Signed-off-by: Peter A. G. Crosthwaite <peter.crosthwa...@petalogix.com>

What does your coroutine caller look like that this is a problem? Does
it make assumptions about the number of yields or anything like that?

The assumption here is not that the block layer owns the coroutine, but
that any code running in a coroutine can yield at any time as long at it
makes sure that eventually the coroutine is reentered. Just like if you
were running in a thread, you certainly wouldn't assume that the block
layer has to create its own thread if it could get preempted, would you?

Can you post some example code that explains the race conditions you're
talking about?

Kevin

Reply via email to