summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroot <root>2008-11-19 02:56:16 +0000
committerroot <root>2008-11-19 02:56:16 +0000
commit7f7a3f778dd0857b7e0a04e3734493d96bc4e863 (patch)
tree08ecb782a09a82a14a852553be43fd261d47daca
parent3c85b2a89c2e609f35fe579ae6058f093a38ce5a (diff)
*** empty log message ***rel-5_132
-rw-r--r--coro.c17
-rw-r--r--coro.h28
2 files changed, 21 insertions, 24 deletions
diff --git a/coro.c b/coro.c
index 25dfef8..cce35ce 100644
--- a/coro.c
+++ b/coro.c
@@ -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);
diff --git a/coro.h b/coro.h
index 09f881f..8ca8d39 100644
--- a/coro.h
+++ b/coro.h
@@ -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