Drop _NSIG to 42 instead of 65 (XCC)
authorKevin Klues <klueska@cs.berkeley.edu>
Fri, 5 Jun 2015 23:14:54 +0000 (16:14 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 12 Jun 2015 16:03:18 +0000 (12:03 -0400)
_NSIG represents the biggest signal number + 1 (including real-time signals).
We choose 42 in homage to h2g2, but also to show that it's not a magic number,
like 32 or 64.  It just happens to be the number of rt signals that we may
(probably won't support in the future).  At any rate, this number must ALWAYS
be <= 64 because we are using a long to represent a sigset.  In Akaros we will
likely impelment all necessary real-time stuff (if we need it) using events
directly, so this point is moot.  Leaving it at 65 was problematic though
because you can't represent all signals (based 1) in a single long, adding to
weird bugs that we would like to avoid in the future.

This helped to fix a bug whee I was previously trying to optimize my
signhandler array to only create (_NSIG - 1) entries because I knew
there were only 64 signals (0 is invalid), but I messed up my mappings
when reuqired to subtract 1 when indexing into this array
to get my signal.  Better to just create one extra entry and call it a
day. However, we need to make sure that all signals can be represented
in our sigmasks (Go cares about this for example, as it installs
handlers for all of its signals up to _NSIG).  If something is off here,
we are (and have been) screwed.

kern/include/ros/bits/posix_signum.h
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/bits/signum.h
user/parlib/signal.c

index b90ffa2..9e567e0 100644 (file)
@@ -39,7 +39,7 @@
 #define SIGSYS         31
 #define SIGUNUSED      31
 
-#define        _NSIG           65
+#define        _NSIG           42
 
 #define __SIGRTMIN     32
 #define __SIGRTMAX     (_NSIG - 1)
index a18ac11..a485b67 100644 (file)
 #define SIGSYS         31      /* Bad system call.  */
 #define SIGUNUSED      31
 
-#define        _NSIG           65      /* Biggest signal number + 1
-                                  (including real-time signals).  */
+/* _NSIG represents the biggest signal number + 1 (including real-time
+ * signals).  We choose 42 in homage to h2g2, but also to show that it's not a
+ * magic number, like 32 or 64.  It just happens to be the number of rt signals
+ * that we may (probably won't support in the future).  At any rate, this
+ * number must ALWAYS be <= 64 because we are using a long to represent a
+ * sigset.  In Akaros we will likely implment all necessary real-time stuff (if
+ * we need it) using events directly, so this point is moot.  Leaving it at 65
+ * was problematic though because you can't represent all signals (based 1) in
+ * a single long, adding to weird bugs that we would like to avoid in the
+ * future.  */
+#define        _NSIG           42
 
+/* We leave these arround incase we decide to imlplement them later, but
+ * currently these __libc* functions are not implemented anywhere on akaros. */
 #define SIGRTMIN        (__libc_current_sigrtmin ())
 #define SIGRTMAX        (__libc_current_sigrtmax ())
 
index dacc1c3..abf515a 100644 (file)
@@ -38,7 +38,7 @@
 #include <waitfreelist.h>
 
 /* This is list of sigactions associated with each posix signal. */
-static struct sigaction sigactions[_NSIG - 1];
+static struct sigaction sigactions[_NSIG];
 
 /* This is a wait-free-list used to hold the data necessary to execute signal
  * handlers inside a 2LS. We are able to store them in a wfl because all
@@ -123,7 +123,8 @@ static __sigacthandler_t default_handlers[] = {
        [SIGWINCH]  = SIGACT_IGN,
        [SIGIO]     = default_term_handler, 
        [SIGPWR]    = SIGACT_IGN,
-       [SIGSYS]    = default_core_handler
+       [SIGSYS]    = default_core_handler,
+       [SIGSYS+1 ... _NSIG-1] = SIGACT_IGN
 };
 
 /* This function allocates a sigdata struct for use when running signal
@@ -157,7 +158,7 @@ void free_sigdata(struct sigdata *sigdata)
 void trigger_posix_signal(int sig_nr, struct siginfo *info, void *aux)
 {
        struct sigaction *action;
-       if (sig_nr > _NSIG - 1 || sig_nr < 0)
+       if (sig_nr >= _NSIG || sig_nr < 0)
                return;
        action = &sigactions[sig_nr];
        /* Would like a switch/case here, but they are pointers.  We can also get
@@ -223,7 +224,7 @@ void init_posix_signals(void)
 
 int sigaddset(sigset_t *__set, int __signo)
 {
-       if (__signo == 0 || __signo > _NSIG) {
+       if (__signo == 0 || __signo >= _NSIG) {
                errno = EINVAL;
                return -1;
        }
@@ -233,7 +234,7 @@ int sigaddset(sigset_t *__set, int __signo)
 
 int sigdelset(sigset_t *__set, int __signo)
 {
-       if (__signo == 0 || __signo > _NSIG) {
+       if (__signo == 0 || __signo >= _NSIG) {
                errno = EINVAL;
                return -1;
        }
@@ -243,7 +244,7 @@ int sigdelset(sigset_t *__set, int __signo)
 
 int sigismember(__const sigset_t *__set, int __signo)
 {
-       if (__signo == 0 || __signo > _NSIG) {
+       if (__signo == 0 || __signo >= _NSIG) {
                errno = EINVAL;
                return -1;
        }
@@ -272,7 +273,7 @@ int sigsuspend(__const sigset_t *__set)
 int sigaction(int __sig, __const struct sigaction *__restrict __act,
               struct sigaction *__restrict __oact)
 {
-       if (__sig > _NSIG - 1 || __sig < 0)
+       if (__sig >= _NSIG || __sig < 0)
                return -1;
        if (__oact) {
                *__oact = sigactions[__sig];