diff options
| -rw-r--r-- | coro.c | 17 | ||||
| -rw-r--r-- | coro.h | 28 | 
2 files changed, 21 insertions, 24 deletions
| @@ -102,15 +102,8 @@ static volatile int trampoline_done;  static void  trampoline (int sig)  { -  if ( -    #if _XOPEN_UNIX > 0 -      _setjmp (new_coro->env) -    #else -      sigsetjmp (new_coro->env, 0) -    #endif -  ) { -      coro_init (); /* start it */ -    } +  if (coro_setjmp (new_coro->env)) +    coro_init (); /* start it */    else      trampoline_done = 1;  } @@ -231,7 +224,7 @@ coro_create (coro_context *ctx, coro_func coro, void *arg, void *sptr, long ssiz  # elif CORO_LOSER -  setjmp (ctx->env); +  coro_setjmp (ctx->env);    #if __CYGWIN__      ctx->env[7] = (long)((char *)sptr + ssize) - sizeof (long);      ctx->env[8] = (long)coro_init; @@ -250,7 +243,7 @@ coro_create (coro_context *ctx, coro_func coro, void *arg, void *sptr, long ssiz  # elif CORO_LINUX -  _setjmp (ctx->env); +  coro_setjmp (ctx->env);    #if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 0 && defined (JB_PC) && defined (JB_SP)      ctx->env[0].__jmpbuf[JB_PC] = (long)coro_init;      ctx->env[0].__jmpbuf[JB_SP] = (long)STACK_ADJUST_PTR (sptr, ssize) - sizeof (long); @@ -269,7 +262,7 @@ coro_create (coro_context *ctx, coro_func coro, void *arg, void *sptr, long ssiz  # elif CORO_IRIX -  sigsetjmp (ctx->env, 0); +  coro_setjmp (ctx->env, 0);    ctx->env[JB_PC] = (__uint64_t)coro_init;    ctx->env[JB_SP] = (__uint64_t)STACK_ADJUST_PTR (sptr, ssize) - sizeof (long); @@ -67,6 +67,7 @@   *            major code cleanup/restructuring.   * 2008-11-10 the .cfi hacks are no longer needed.   * 2008-11-16 work around a freebsd pthread bug. + * 2008-11-19 define coro_*jmp symbols for easier porting.   */  #ifndef CORO_H @@ -241,22 +242,25 @@ struct coro_context {  # include <setjmp.h> -struct coro_context { -#if _XOPEN_UNIX > 0 || CORO_LOSER -  jmp_buf env; -#else -  sigjmp_buf env; -#endif -}; - -# if _XOPEN_UNIX > 0 -#  define coro_transfer(p,n) do { if (!  _setjmp ((p)->env   ))   _longjmp ((n)->env, 1); } while (0) +# if _XOPEN_UNIX > 0 || defined (_setjmp) +#  define coro_jmp_buf      jmp_buf +#  define coro_setjmp(env)  _setjmp (env) +#  define coro_longjmp(env) _longjmp ((env), 1)  # elif CORO_LOSER -#  define coro_transfer(p,n) do { if (!   setjmp ((p)->env   ))    longjmp ((n)->env, 1); } while (0) +#  define coro_jmp_buf      jmp_buf +#  define coro_setjmp(env)  setjmp (env) +#  define coro_longjmp(env) longjmp ((env), 1)  # else -#  define coro_transfer(p,n) do { if (!sigsetjmp ((p)->env, 0)) siglongjmp ((n)->env, 1); } while (0) +#  define coro_jmp_buf      sigjmp_buf +#  define coro_setjmp(env)  sigsetjmp (env, 0) +#  define coro_longjmp(env) siglongjmp ((env), 1)  # endif +struct coro_context { +  coro_jmp_buf env; +}; + +# define coro_transfer(p,n) do { if (!coro_setjmp ((p)->env)) coro_longjmp ((n)->env); } while (0)  # define coro_destroy(ctx) (void *)(ctx)  #elif CORO_ASM | 
