added sigsetjmp() & siglongjmp()
authoreck <none@none>
Mon, 22 Jan 1990 12:53:21 +0000 (12:53 +0000)
committereck <none@none>
Mon, 22 Jan 1990 12:53:21 +0000 (12:53 +0000)
lang/cem/libcc.ansi/setjmp/LIST
lang/cem/libcc.ansi/setjmp/Makefile
lang/cem/libcc.ansi/setjmp/setjmp.e
lang/cem/libcc.ansi/setjmp/sigmisc.c [new file with mode: 0644]

index aa8e83d..fa727ca 100644 (file)
@@ -1,2 +1,2 @@
 clean:
-       rm -f setjmp.o OLIST
+       rm -f setjmp.o sigmisc.o OLIST
index 5519075..acc757e 100644 (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
diff --git a/lang/cem/libcc.ansi/setjmp/sigmisc.c b/lang/cem/libcc.ansi/setjmp/sigmisc.c
new file mode 100644 (file)
index 0000000..45c97f5
--- /dev/null
@@ -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 */