On Wed, Jan 26, 2011 at 05:29:23PM +0200, Avi Kivity wrote: > On 01/22/2011 11:29 AM, Stefan Hajnoczi wrote: > >Add functions to create coroutines and transfer control into a coroutine > >and back out again. > > > > > >+ > >+struct Coroutine { > >+ struct coroutine co; > >+}; > >+ > > > >+/** > >+ * Coroutine entry point > >+ * > >+ * When the coroutine is entered for the first time, opaque is passed in as > >an > >+ * argument. > >+ * > >+ * When this function returns, the coroutine is destroyed automatically and > >the > >+ * return value is passed back to the caller who last entered the coroutine. > >+ */ > >+typedef void * coroutine_fn CoroutineEntry(void *opaque); > > The more modern style is to use the Coroutine structure as argument, > and let the coroutine function use container_of() to obtain access > to its own data structures. Similarly it can store any return value > there, avoiding casts to and from void pointers.
Yes, container_of() would be nice but we need to be careful to support pooling Coroutine structs. Or maybe just pool the mmaped stacks. Stefan