From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:37193) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QKSYc-0003MA-5O for qemu-devel@nongnu.org; Thu, 12 May 2011 05:51:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QKSYb-0000NG-46 for qemu-devel@nongnu.org; Thu, 12 May 2011 05:51:46 -0400 Received: from thoth.sbs.de ([192.35.17.2]:28662) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QKSYa-0000My-Lg for qemu-devel@nongnu.org; Thu, 12 May 2011 05:51:45 -0400 Message-ID: <4DCBADA4.6030401@siemens.com> Date: Thu, 12 May 2011 11:51:32 +0200 From: Jan Kiszka 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: Kevin Wolf , Anthony Liguori , Venkateswararao Jujjuri , qemu-devel@nongnu.org On 2011-05-11 12:15, Stefan Hajnoczi wrote: > 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. Mmh, is there anything that conceptually prevent fixing this limitation later on? I would really like to remove such dependency long-term as well to have VCPUs operate truly independently on independent device models. Jan -- Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux