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
|
setjmp.e
|
||||||
|
sigmisc.c
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
clean:
|
clean:
|
||||||
rm -f setjmp.o OLIST
|
rm -f setjmp.o sigmisc.o OLIST
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
#
|
#
|
||||||
mes 2,_EM_WSIZE,_EM_PSIZE
|
mes 2,_EM_WSIZE,_EM_PSIZE
|
||||||
|
|
||||||
;
|
;
|
||||||
; layout of a setjmp buffer:
|
; 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 |
|
; | GTO descriptor |
|
||||||
|
@ -24,11 +25,24 @@ gtobuf
|
||||||
bss 3*_EM_PSIZE,0,0
|
bss 3*_EM_PSIZE,0,0
|
||||||
|
|
||||||
inp $fill_ret_area
|
inp $fill_ret_area
|
||||||
exp $setjmp
|
exp $__setjmp
|
||||||
pro $setjmp,0
|
pro $__setjmp,0
|
||||||
#ifdef __BSD4_2
|
#if defined(_POSIX_SOURCE)
|
||||||
; save mask of currently blocked signals.
|
; save mask of currently blocked signals.
|
||||||
; longjmp must restore this mask
|
; 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
|
loc 0
|
||||||
cal $sigblock
|
cal $sigblock
|
||||||
asp _EM_WSIZE
|
asp _EM_WSIZE
|
||||||
|
@ -41,7 +55,7 @@ gtobuf
|
||||||
lxl 0
|
lxl 0
|
||||||
dch ; Local Base of caller
|
dch ; Local Base of caller
|
||||||
lxa 0 ; Stackpointer of caller
|
lxa 0 ; Stackpointer of caller
|
||||||
lal _EM_PSIZE
|
lal _EM_PSIZE+_EM_WSIZE
|
||||||
loi _EM_PSIZE ; Return address of caller
|
loi _EM_PSIZE ; Return address of caller
|
||||||
lal 0
|
lal 0
|
||||||
loi _EM_PSIZE ; address of jmpbuf
|
loi _EM_PSIZE ; address of jmpbuf
|
||||||
|
@ -58,7 +72,19 @@ gtobuf
|
||||||
|
|
||||||
exp $longjmp
|
exp $longjmp
|
||||||
pro $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
|
; restore signal mask
|
||||||
lal 0
|
lal 0
|
||||||
loi _EM_PSIZE
|
loi _EM_PSIZE
|
||||||
|
@ -76,8 +102,7 @@ gtobuf
|
||||||
dup _EM_WSIZE
|
dup _EM_WSIZE
|
||||||
zne *3
|
zne *3
|
||||||
; of course, longjmp may not return 0!
|
; of course, longjmp may not return 0!
|
||||||
asp _EM_WSIZE
|
inc
|
||||||
loc 1
|
|
||||||
3
|
3
|
||||||
; put return value in function result area
|
; put return value in function result area
|
||||||
cal $fill_ret_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…
Add table
Reference in a new issue