qemu-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]