On Fri, 2 Feb 2007, Linus Torvalds wrote: > > You get some other funny things from co-routines which are very powerful, > > very dangerous, or plain insane > > You forgot "very hard to think about". > > We DO NOT want coroutines in general. It's clever, but it's > (a) impossible to do without language support that C doesn't have, or > some really really horrid macro constructs that really only work for > very specific and simple cases. > (b) very non-intuitive unless you've worked with coroutines a lot (and > almost nobody has) Actually, coroutines are not too bad to program once you have a total-coverage async scheduler to run them. The attached (very sketchy) example uses libpcl ( http://www.xmailserver.org/libpcl.html ) and epoll as scheduler (but here you can really use anything). You can implement coroutines in many way, from C preprocessor macros up to anything, but in the libpcl case they are simply switched stacks. Like fibrils are supposed to be. The problem is that in order to make a real-life example of coroutine-based application work, you need everything that can put you at sleep (syscalls or any external library call you have no control on) implemented in an async way. And what I ended up doing is exactly what Zab did inside the kernel. In my case a dynamic pool of (userspace) threads servicing any non-native potentially pre-emptive call, and signaling the result to a pollable fd (pipe in my case) that is integrated in the epoll (poll/select whatever) scheduler. I personally find Zab idea a really good one, since it allows for generic kernel async implementation, w/out the burden of dirtying kernel code paths with AIO knowledge. Being it fibrils or real kthreads, it is IMO definitely worth a very close look. - Davide