--- libcoro/coro.h 2005/03/03 17:20:31 1.9 +++ libcoro/coro.h 2006/10/26 07:27:50 1.15 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2005 Marc Alexander Lehmann + * Copyright (c) 2001-2006 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: @@ -35,10 +35,20 @@ * */ +/* + * 2006-10-26 Include stddef.h on OS X to work around one of its bugs. + * Reported by Michael_G_Schwern. + */ + #ifndef CORO_H #define CORO_H -#define CORO_VERSION 1 +#define CORO_VERSION 2 + +/* + * Changes since API version 1: + * replaced bogus -DCORO_LOOSE with gramatically more correct -DCORO_LOSER + */ /* * This library consists of only three files @@ -52,11 +62,11 @@ * * This flavour uses SUSv2's get/set/swap/makecontext functions that * unfortunately only newer unices support. - * Use this for GNU/Linux + glibc-2.2.3. + * Use this for GNU/Linux + glibc-2.2.3 and possibly higher. * * -DCORO_SJLJ * - * This flavour uses SUSv'2 setjmp/longjmp and sigaltstack functions to + * This flavour uses SUSv2's setjmp/longjmp and sigaltstack functions to * 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 @@ -66,9 +76,9 @@ * -DCORO_LINUX * * Old GNU/Linux systems (<= glibc-2.1) work with this implementation - * (very fast). + * (it is very fast and therefore recommended over other methods). * - * -DCORO_LOOSE + * -DCORO_LOSER * * Microsoft's highly proprietary platform doesn't support sigaltstack, and * this automatically selects a suitable workaround for this platform. @@ -79,7 +89,7 @@ * 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 + * the model. This currently works for CORO_LOSER only. For the other * alternatives you should check (e.g. using autoconf) and define the * following symbols: HAVE_UCONTEXT_H / HAVE_SETJMP_H / HAVE_SIGALTSTACK. */ @@ -92,13 +102,13 @@ /* * 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, - * implement your own switching primitive. + * implement your own switching primitive if you need it. */ typedef struct coro_context coro_context; /* * This function creates a new coroutine. Apart from a pointer to an - * uninitialized coro_context, it expects a pointer to the entry function + * uninitialised coro_context, it expects a pointer to the entry function * and the single pointer value that is given to it as argument. * * Allocating/deallocating the stack is your own responsibility, so there is @@ -121,11 +131,11 @@ /*****************************************************************************/ -#if !defined(CORO_LOOSE) && !defined(CORO_UCONTEXT) \ +#if !defined(CORO_LOSER) && !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 */ +# define CORO_LOSER 1 /* you don't win with windoze */ # elif defined(__linux) && defined(__x86) # elif defined(HAVE_UCONTEXT_H) # define CORO_UCONTEXT 1 @@ -148,9 +158,9 @@ #define coro_transfer(p,n) swapcontext (&((p)->uc), &((n)->uc)) -#elif CORO_SJLJ || CORO_LOOSE || CORO_LINUX || CORO_IRIX +#elif CORO_SJLJ || CORO_LOSER || CORO_LINUX || CORO_IRIX -#ifdef CORO_LINUX +#if defined(CORO_LINUX) && !defined(_GNU_SOURCE) # define _GNU_SOURCE // for linux libc #endif