--- libcoro/coro.h 2001/07/23 18:04:59 1.2 +++ libcoro/coro.h 2005/03/21 14:38:14 1.10 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001 Marc Alexander Lehmann + * Copyright (c) 2001-2005 Marc Alexander Lehmann * * Redistribution and use in source and binary forms, with or without modifica- * tion, are permitted provided that the following conditions are met: @@ -30,16 +30,19 @@ * go to Ralf S. Engelschall . * * This coroutine library is very much stripped down. You should either - * build your own process avstraction using it or - better - just use GNU + * build your own process abstraction using it or - better - just use GNU * Portable Threads, http://www.gnu.org/software/pth/. + * */ #ifndef CORO_H #define CORO_H +#define CORO_VERSION 1 + /* * This library consists of only three files - * coro.h, coro.c and LICENSE + * coro.h, coro.c and LICENSE (and optionally README) * * It implements what is known as coroutines, in a hopefully * portable way. At the moment you have to define which kind @@ -57,8 +60,13 @@ * do it's job. Coroutine creation is much slower than UCONTEXT, but * context switching is often a bit cheaper. It should work on almost * all unices. Use this for GNU/Linux + glibc-2.2. glibc-2.1 and below - * do not work with any model (neither sigaltstack nor context functions - * are implemented) + * do not work with any sane model (neither sigaltstack nor context + * functions are implemented) + * + * -DCORO_LINUX + * + * Old GNU/Linux systems (<= glibc-2.1) work with this implementation + * (very fast). * * -DCORO_LOOSE * @@ -66,6 +74,10 @@ * this automatically selects a suitable workaround for this platform. * (untested) * + * -DCORO_IRIX + * + * SGI's version of Microsoft's NT ;) + * * If you define neither of these symbols, coro.h will try to autodetect * the model. This currently works for CORO_LOOSE only. For the other * alternatives you should check (e.g. using autoconf) and define the @@ -73,11 +85,10 @@ */ /* - * This is the type for the top function of a new coroutine. + * This is the type for the initialization function of a new coroutine. */ typedef void (*coro_func)(void *); - /* * A coroutine state is saved in the following structure. Treat it as a * opaque type. errno and sigmask might be saved, but don't rely on it, @@ -93,9 +104,9 @@ * Allocating/deallocating the stack is your own responsibility, so there is * no coro_destroy function. */ -void coro_create(coro_context *ctx, - coro_func coro, void *arg, - void *sptr, long ssize); +void coro_create (coro_context *ctx, + coro_func coro, void *arg, + void *sptr, long ssize); /* * The following prototype defines the coroutine switching function. It is @@ -108,9 +119,14 @@ * That was it. No other user-visible functions are implemented here. */ -#if !defined(CORO_LOOSE) && !defined(CORO_UCONTEXT) && !defined(CORO_SJLJ) +/*****************************************************************************/ + +#if !defined(CORO_LOOSE) && !defined(CORO_UCONTEXT) \ + && !defined(CORO_SJLJ) && !defined(CORO_LINUX) \ + && !defined(CORO_IRIX) # if defined(WINDOWS) # define CORO_LOOSE 1 /* you don't win with windoze */ +# elif defined(__linux) && defined(__x86) # elif defined(HAVE_UCONTEXT_H) # define CORO_UCONTEXT 1 # elif defined(HAVE_SETJMP_H) && defined(HAVE_SIGALTSTACK) @@ -120,6 +136,8 @@ # endif #endif +/*****************************************************************************/ + #if CORO_UCONTEXT #include @@ -128,9 +146,13 @@ ucontext_t uc; }; -#define coro_transfer(p,n) swapcontext(&((p)->uc), &((n)->uc)) +#define coro_transfer(p,n) swapcontext (&((p)->uc), &((n)->uc)) -#elif CORO_SJLJ || CORO_LOOSE +#elif CORO_SJLJ || CORO_LOOSE || CORO_LINUX || CORO_IRIX + +#if defined(CORO_LINUX) && !defined(_GNU_SOURCE) +# define _GNU_SOURCE // for linux libc +#endif #include @@ -138,7 +160,7 @@ jmp_buf env; }; -#define coro_transfer(p,n) if (!setjmp ((p)->env)) longjmp ((n)->env, 1) +#define coro_transfer(p,n) do { if (!setjmp ((p)->env)) longjmp ((n)->env, 1); } while(0) #endif