From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:36988) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QK7QG-00088j-Dy for qemu-devel@nongnu.org; Wed, 11 May 2011 07:17:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QK7QF-0003BV-66 for qemu-devel@nongnu.org; Wed, 11 May 2011 07:17:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58541) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QK7QE-0003B8-VF for qemu-devel@nongnu.org; Wed, 11 May 2011 07:17:43 -0400 Message-ID: <4DCA70F5.6000306@redhat.com> Date: Wed, 11 May 2011 13:20:21 +0200 From: Kevin Wolf MIME-Version: 1.0 References: <1305108925-26048-1-git-send-email-stefanha@linux.vnet.ibm.com> <1305108925-26048-2-git-send-email-stefanha@linux.vnet.ibm.com> In-Reply-To: <1305108925-26048-2-git-send-email-stefanha@linux.vnet.ibm.com> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefan Hajnoczi Cc: Anthony Liguori , Venkateswararao Jujjuri , qemu-devel@nongnu.org Am 11.05.2011 12:15, schrieb Stefan Hajnoczi: > From: Kevin Wolf > > 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 but it has been > significantly rewritten by Kevin Wolf to use > setjmp()/longjmp() instead of the more expensive swapcontext(). > > Signed-off-by: Kevin Wolf > Signed-off-by: Stefan Hajnoczi For the diff between my latest version and this patch: Reviewed-by: Kevin Wolf