[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 15:08:43 +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 14:36, schrieb Anthony Liguori:
> On 05/11/2011 05:15 AM, Stefan Hajnoczi wrote:
>> 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);
>
> Why do away with yieldto?
>
> Do we have performance data around setjmp vs. setcontext?
I did some quick ad-hoc tests when I introduced setjmp, but don't have
them any more. IIRC, it was something like a factor of 3.
>> diff --git a/coroutine-win32.c b/coroutine-win32.c
>> new file mode 100644
>> index 0000000..f4521c3
>> --- /dev/null
>> +++ b/coroutine-win32.c
>> @@ -0,0 +1,57 @@
>> +/*
>> + * Win32 coroutine initialization code
>> + *
>> + * Copyright (c) 2011 Kevin Wolf<address@hidden>
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> copy
>> + * of this software and associated documentation files (the "Software"), to
>> deal
>> + * in the Software without restriction, including without limitation the
>> rights
>> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
>> + * copies of the Software, and to permit persons to whom the Software is
>> + * furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice shall be included
>> in
>> + * all copies or substantial portions of the Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
>> OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
>> OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>> FROM,
>> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
>> + * THE SOFTWARE.
>> + */
>> +
>> +#include "qemu-coroutine-int.h"
>> +
>> +static void __attribute__((used)) trampoline(Coroutine *co)
>> +{
>> + if (!setjmp(co->env)) {
>> + return;
>> + }
>> +
>> + while (true) {
>> + co->entry(co->data);
>> + if (!setjmp(co->env)) {
>> + longjmp(co->caller->env, COROUTINE_TERMINATE);
>> + }
>> + }
>> +}
>> +
>> +int qemu_coroutine_init_env(Coroutine *co)
>> +{
>> +#ifdef __i386__
>> + asm volatile(
>> + "mov %%esp, %%ebx;"
>> + "mov %0, %%esp;"
>> + "pushl %1;"
>> + "call _trampoline;"
>> + "mov %%ebx, %%esp;"
>> + : : "r" (co->stack + co->stack_size), "r" (co) : "ebx"
>> + );
>
> So the only Linux host we support is x86??
>
> We can't reasonably do this IMHO. If we're going to go this route, we
> should at least fall back to setcontext for the sake of portability.
This is win32 code, Linux uses ucontext for initialization.
Kevin
Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Anthony Liguori, 2011/05/11
Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines,
Kevin Wolf <=
Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Stefan Weil, 2011/05/11
Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Jan Kiszka, 2011/05/12
Re: [Qemu-devel] [PATCH 1/2] coroutine: introduce coroutines, Kevin Wolf, 2011/05/12