Am 11.05.2011 12:15, schrieb Stefan Hajnoczi:
> From: Kevin Wolf <kw...@redhat.com>
> 
> Asynchronous code is becoming very complex.  At the same time
> synchronous code is growing because it is convenient to write.
> Sometimes duplicate code paths are even added, one synchronous and the
> other asynchronous.  This patch introduces coroutines which allow code
> that looks synchronous but is asynchronous under the covers.
> 
> A coroutine has its own stack and is therefore able to preserve state
> across blocking operations, which traditionally require callback
> functions and manual marshalling of parameters.
> 
> Creating and starting a coroutine is easy:
> 
>   coroutine = qemu_coroutine_create(my_coroutine);
>   qemu_coroutine_enter(coroutine, my_data);
> 
> The coroutine then executes until it returns or yields:
> 
>   void coroutine_fn my_coroutine(void *opaque) {
>       MyData *my_data = opaque;
> 
>       /* do some work */
> 
>       qemu_coroutine_yield();
> 
>       /* do some more work */
>   }
> 
> Yielding switches control back to the caller of qemu_coroutine_enter().
> This is typically used to switch back to the main thread's event loop
> after issuing an asynchronous I/O request.  The request callback will
> then invoke qemu_coroutine_enter() once more to switch back to the
> coroutine.
> 
> Note that coroutines never execute concurrently and should only be used
> from threads which hold the global mutex.  This restriction makes
> programming with coroutines easier than with threads.  Race conditions
> cannot occur since only one coroutine may be active at any time.  Other
> coroutines can only run across yield.
> 
> This coroutines implementation is based on the gtk-vnc implementation
> written by Anthony Liguori <anth...@codemonkey.ws> but it has been
> significantly rewritten by Kevin Wolf <kw...@redhat.com> to use
> setjmp()/longjmp() instead of the more expensive swapcontext().
> 
> Signed-off-by: Kevin Wolf <kw...@redhat.com>
> Signed-off-by: Stefan Hajnoczi <stefa...@linux.vnet.ibm.com>

For the diff between my latest version and this patch:

Reviewed-by: Kevin Wolf <kw...@redhat.com>

Reply via email to