-typedef unsigned long jmp_buf [64];
+typedef unsigned long long jmp_buf[32];
-typedef unsigned long jmp_buf [7];
+typedef unsigned long jmp_buf[6];
-typedef unsigned long jmp_buf [9];
+typedef unsigned long jmp_buf[8];
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
|| defined(_BSD_SOURCE)
-typedef unsigned long sigjmp_buf[(128+sizeof(jmp_buf))/sizeof(long)];
+typedef struct {
+ jmp_buf __jb;
+ unsigned long __fl;
+ unsigned long __ss[128];
+} sigjmp_buf[1];
int sigsetjmp (sigjmp_buf, int);
void siglongjmp (sigjmp_buf, int);
#endif
#include <setjmp.h>
#include <signal.h>
#include <stdlib.h>
+#include "syscall.h"
void siglongjmp(sigjmp_buf buf, int ret)
{
- unsigned long *flag = buf + sizeof(jmp_buf)/sizeof(long) - 1;
- sigset_t *mask = (void *)(flag + 1);
- if (*flag)
- sigprocmask (SIG_SETMASK, mask, NULL);
- longjmp((void *)buf, ret);
+ if (buf->__fl)
+ __syscall(SYS_rt_sigprocmask, SIG_SETMASK, buf->__ss, 0, 8);
+ longjmp(buf->__jb, ret);
}
int sigsetjmp(sigjmp_buf buf, int save)
{
- unsigned long *flag = buf + sizeof(jmp_buf)/sizeof(long);
- sigset_t *mask = (void *)(flag + 1);
- if ((*flag = save))
- sigprocmask (SIG_SETMASK, NULL, mask);
- return setjmp((void *)buf);
+ if ((buf->__fl = save))
+ pthread_sigmask(SIG_SETMASK, 0, (sigset_t *)buf->__ss);
+ return setjmp(buf->__jb);
}