[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines
From: |
Kevin Wolf |
Subject: |
Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines |
Date: |
Wed, 11 May 2011 13:20:21 +0200 |
User-agent: |
Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.15) Gecko/20101027 Fedora/3.0.10-1.fc12 Thunderbird/3.0.10 |
Am 11.05.2011 12:15, schrieb Stefan Hajnoczi:
> From: Kevin Wolf <address@hidden>
>
> 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 <address@hidden> but it has been
> significantly rewritten by Kevin Wolf <address@hidden> to use
> setjmp()/longjmp() instead of the more expensive swapcontext().
>
> Signed-off-by: Kevin Wolf <address@hidden>
> Signed-off-by: Stefan Hajnoczi <address@hidden>
For the diff between my latest version and this patch:
Reviewed-by: Kevin Wolf <address@hidden>
- [Qemu-devel] [PATCH 0/2] Coroutines for better asynchronous programming, Stefan Hajnoczi, 2011/05/11
- [Qemu-devel] [PATCH 2/2] coroutine: add check-coroutine automated tests, Stefan Hajnoczi, 2011/05/11
- [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Stefan Hajnoczi, 2011/05/11
- Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines,
Kevin Wolf <=
- Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Paolo Bonzini, 2011/05/11
- Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Kevin Wolf, 2011/05/11
- Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Anthony Liguori, 2011/05/11
- Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Paolo Bonzini, 2011/05/11
- Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Anthony Liguori, 2011/05/11
- Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Paolo Bonzini, 2011/05/11
- Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Daniel P. Berrange, 2011/05/11
- Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Jamie Lokier, 2011/05/24
- Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Stefan Hajnoczi, 2011/05/24
- Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Jamie Lokier, 2011/05/24