added sigsetjmp() & siglongjmp()

This commit is contained in:
eck 1990-01-22 12:53:21 +00:00
parent a940c44ae5
commit 13c2ffcc5b
4 changed files with 74 additions and 10 deletions

View file

@ -1 +1,2 @@
setjmp.e
sigmisc.c

View file

@ -1,2 +1,2 @@
clean:
rm -f setjmp.o OLIST
rm -f setjmp.o sigmisc.o OLIST

View file

@ -1,11 +1,12 @@
#
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 |
@ -24,11 +25,24 @@ gtobuf
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
@ -41,7 +55,7 @@ gtobuf
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
@ -58,7 +72,19 @@ gtobuf
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
@ -76,8 +102,7 @@ gtobuf
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

View file

@ -0,0 +1,38 @@
/*
* 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 */