#
mes 2,_EM_WSIZE,_EM_PSIZE
-
;
; layout of a setjmp buffer:
;
; -----------------
-; | signal mask | (only for Berkeley 4.[2-])
+; | flag | (!0 when blocked signals saved (POSIX))
+; -----------------
+; | signal mask/set | (for Berkeley 4.[2-] / POSIX)
; -----------------
; | |
; | GTO descriptor |
bss 3*_EM_PSIZE,0,0
inp $fill_ret_area
- exp $setjmp
- pro $setjmp,0
-#ifdef __BSD4_2
+ exp $__setjmp
+ pro $__setjmp,0
+#if defined(_POSIX_SOURCE)
; save mask of currently blocked signals.
; longjmp must restore this mask
+ lol _EM_PSIZE ; the flag integer at offset _EM_PSIZE
+ lal 0
+ loi _EM_PSIZE
+ stf 3*_EM_PSIZE+_EM_LSIZE
+ lol _EM_PSIZE ; the flag integer at offset _EM_PSIZE
+ zeq *1
+ lal 0
+ loi _EM_PSIZE
+ adp 3*_EM_PSIZE
+ cal $__newsigset
+ asp _EM_PSIZE
+1
+#elif defined(__BSD4_2)
loc 0
cal $sigblock
asp _EM_WSIZE
lxl 0
dch ; Local Base of caller
lxa 0 ; Stackpointer of caller
- lal _EM_PSIZE
+ lal _EM_PSIZE+_EM_WSIZE
loi _EM_PSIZE ; Return address of caller
lal 0
loi _EM_PSIZE ; address of jmpbuf
exp $longjmp
pro $longjmp,?
-#ifdef __BSD4_2
+#if defined(_POSIX_SOURCE)
+; restore blocked mask
+ lal 0
+ loi _EM_PSIZE
+ lof 3*_EM_PSIZE+_EM_LSIZE
+ zeq *2
+ lal 0
+ loi _EM_PSIZE
+ adp 3*_EM_PSIZE
+ cal $__oldsigset
+ asp _EM_PSIZE
+2
+#elif defined(__BSD4_2)
; restore signal mask
lal 0
loi _EM_PSIZE
dup _EM_WSIZE
zne *3
; of course, longjmp may not return 0!
- asp _EM_WSIZE
- loc 1
+ inc
3
; put return value in function result area
cal $fill_ret_area
--- /dev/null
+/*
+ * sigmisc.c - used to get a signal mask
+ */
+/* $Header$ */
+
+#if defined(_POSIX_SOURCE)
+
+/* This can't be done in setjmp.e, since SIG_SETMASK is defined in
+ * <signal.h>. This is a C-file, which can't be included.
+ */
+
+#include <signal.h>
+#include <stddef.h>
+
+int _sigprocmask(int, sigset_t *, sigset_t *);
+
+static void
+__testsigset(void) {
+ /* This switch compiles when a sigset_t has the right size. */
+ switch(0) {
+ case 0:
+ case sizeof(sigset_t) <= sizeof(long): break;
+ }
+}
+
+void
+__newsigset(sigset_t *p)
+{
+ /* The SIG_SETMASK is not significant */
+ _sigprocmask(SIG_SETMASK, NULL, p);
+}
+
+void
+__oldsigset(sigset_t *p)
+{
+ _sigprocmask(SIG_SETMASK, p, NULL);
+}
+#endif /* _POSIX_SOURCE */