From: eck Date: Mon, 22 Jan 1990 12:53:21 +0000 (+0000) Subject: added sigsetjmp() & siglongjmp() X-Git-Tag: release-5-5~1903 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=13c2ffcc5bbaf925e7b4bc12048b553d58426d84;p=ack.git added sigsetjmp() & siglongjmp() --- diff --git a/lang/cem/libcc.ansi/setjmp/LIST b/lang/cem/libcc.ansi/setjmp/LIST index 305ef0b22..63685a130 100644 --- a/lang/cem/libcc.ansi/setjmp/LIST +++ b/lang/cem/libcc.ansi/setjmp/LIST @@ -1 +1,2 @@ setjmp.e +sigmisc.c diff --git a/lang/cem/libcc.ansi/setjmp/Makefile b/lang/cem/libcc.ansi/setjmp/Makefile index aa8e83df2..fa727ca6e 100644 --- a/lang/cem/libcc.ansi/setjmp/Makefile +++ b/lang/cem/libcc.ansi/setjmp/Makefile @@ -1,2 +1,2 @@ clean: - rm -f setjmp.o OLIST + rm -f setjmp.o sigmisc.o OLIST diff --git a/lang/cem/libcc.ansi/setjmp/setjmp.e b/lang/cem/libcc.ansi/setjmp/setjmp.e index 551907519..acc757e0d 100644 --- a/lang/cem/libcc.ansi/setjmp/setjmp.e +++ b/lang/cem/libcc.ansi/setjmp/setjmp.e @@ -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 diff --git a/lang/cem/libcc.ansi/setjmp/sigmisc.c b/lang/cem/libcc.ansi/setjmp/sigmisc.c new file mode 100644 index 000000000..45c97f5a8 --- /dev/null +++ b/lang/cem/libcc.ansi/setjmp/sigmisc.c @@ -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 + * . This is a C-file, which can't be included. + */ + +#include +#include + +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 */