added sigsetjmp() & siglongjmp()
This commit is contained in:
parent
a940c44ae5
commit
13c2ffcc5b
4 changed files with 74 additions and 10 deletions
|
@ -1 +1,2 @@
|
|||
setjmp.e
|
||||
sigmisc.c
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
clean:
|
||||
rm -f setjmp.o OLIST
|
||||
rm -f setjmp.o sigmisc.o OLIST
|
||||
|
|
|
@ -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
|
||||
|
|
38
lang/cem/libcc.ansi/setjmp/sigmisc.c
Normal file
38
lang/cem/libcc.ansi/setjmp/sigmisc.c
Normal 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 */
|
Loading…
Reference in a new issue