Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2005-03-18 12:46:30 +0300
committerCorinna Vinschen <corinna@vinschen.de>2005-03-18 12:46:30 +0300
commit5c9b5ac72d1a7d8326f234d5a2fb6ca5be1070e6 (patch)
treed610e2324e311de068a7f52413b111d2097611e5 /newlib/libc/include
parentdd801fdabd7e6d80e69cbde473b723a6ef7cff86 (diff)
* libc/include/machine/setjmp.h (sigsetjmp): Use GCC extension to
evaluate first parameter only once. (siglongjmp): Ditto.
Diffstat (limited to 'newlib/libc/include')
-rw-r--r--newlib/libc/include/machine/setjmp.h23
1 files changed, 23 insertions, 0 deletions
diff --git a/newlib/libc/include/machine/setjmp.h b/newlib/libc/include/machine/setjmp.h
index 7a61fcfea..fe05ee1ee 100644
--- a/newlib/libc/include/machine/setjmp.h
+++ b/newlib/libc/include/machine/setjmp.h
@@ -236,6 +236,27 @@ typedef int sigjmp_buf[_JBLEN+2];
# define _CYGWIN_WORKING_SIGSETJMP
#endif
+#if defined(__GNUC__)
+
+#define sigsetjmp(env, savemask) \
+ ({ \
+ sigjmp_buf *_sjbuf = &(env); \
+ ((*_sjbuf)[_SAVEMASK] = savemask,\
+ sigprocmask (SIG_SETMASK, 0, (sigset_t *)((*_sjbuf) + _SIGMASK)),\
+ setjmp (*_sjbuf)); \
+ })
+
+#define siglongjmp(env, val) \
+ ({ \
+ sigjmp_buf *_sjbuf = &(env); \
+ ((((*_sjbuf)[_SAVEMASK]) ? \
+ sigprocmask (SIG_SETMASK, (sigset_t *)((*_sjbuf) + _SIGMASK), 0)\
+ : 0), \
+ longjmp (*_sjbuf, val)); \
+ })
+
+#else /* !__GNUC__ */
+
#define sigsetjmp(env, savemask) ((env)[_SAVEMASK] = savemask,\
sigprocmask (SIG_SETMASK, 0, (sigset_t *) ((env) + _SIGMASK)),\
setjmp (env))
@@ -244,6 +265,8 @@ typedef int sigjmp_buf[_JBLEN+2];
sigprocmask (SIG_SETMASK, (sigset_t *) ((env) + _SIGMASK), 0):0),\
longjmp (env, val))
+#endif
+
#ifdef __cplusplus
}
#endif