]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: if os/signal is not in use, crash on
authorRuss Cox <rsc@golang.org>
Thu, 17 Dec 2009 04:20:50 +0000 (20:20 -0800)
committerRuss Cox <rsc@golang.org>
Thu, 17 Dec 2009 04:20:50 +0000 (20:20 -0800)
most signals, so that ordinary programs
can be killed, for example.

Fixes #434.

R=dsymonds1
CC=golang-dev, hoisie
https://golang.org/cl/180064

13 files changed:
src/pkg/os/signal/signal.go
src/pkg/runtime/darwin/386/signal.c
src/pkg/runtime/darwin/amd64/signal.c
src/pkg/runtime/darwin/signals.h
src/pkg/runtime/extern.go
src/pkg/runtime/freebsd/386/signal.c
src/pkg/runtime/freebsd/amd64/signal.c
src/pkg/runtime/freebsd/signals.h
src/pkg/runtime/linux/386/signal.c
src/pkg/runtime/linux/amd64/signal.c
src/pkg/runtime/linux/signals.h
src/pkg/runtime/runtime.h
src/pkg/runtime/sigqueue.cgo

index df81e512ea02103ce1bd7f48ca9e8137e08e9e35..666c03e73c4ff87b5900353ffd315cbda8d597af 100644 (file)
@@ -41,6 +41,7 @@ func process(ch chan<- Signal) {
 }
 
 func init() {
+       runtime.Siginit()
        ch := make(chan Signal) // Done here so Incoming can have type <-chan Signal
        Incoming = ch
        go process(ch)
index 4023439b3938fe1711eece6e9d6b53d839e5a510..7978739a6d41cc0c8e6ccea5be3e376f407585f2 100644 (file)
@@ -41,8 +41,9 @@ sighandler(int32 sig, Siginfo *info, void *context)
        Regs *r;
 
        if(sigtab[sig].flags & SigQueue) {
-               sigsend(sig);
-               return;
+               if(sigsend(sig) || (sigtab[sig].flags & SigIgnore))
+                       return;
+               exit(2);        // SIGINT, SIGTERM, etc
        }
 
        if(panicking)   // traceback already printed
index 5e26a713eea00ddbcf8cb45d88c0a308d631302c..bf1bca994f29ccd495678cbd409e9fafd1001b8c 100644 (file)
@@ -49,8 +49,9 @@ sighandler(int32 sig, Siginfo *info, void *context)
        Regs *r;
 
        if(sigtab[sig].flags & SigQueue) {
-               sigsend(sig);
-               return;
+               if(sigsend(sig) || (sigtab[sig].flags & SigIgnore))
+                       return;
+               exit(2);        // SIGINT, SIGTERM, etc
        }
 
        if(panicking)   // traceback already printed
index 48a5db12d8ce5282a36234258fced8a9165ef04e..449a6a7db82f4d8853dc2538fd216a46d5c04922 100644 (file)
@@ -22,24 +22,24 @@ static SigTab sigtab[] = {
        /* 11 */        C, "SIGSEGV: segmentation violation",
        /* 12 */        C, "SIGSYS: bad system call",
        /* 13 */        I, "SIGPIPE: write to broken pipe",
-       /* 14 */        Q+R, "SIGALRM: alarm clock",
+       /* 14 */        Q+I+R, "SIGALRM: alarm clock",
        /* 15 */        Q+R, "SIGTERM: termination",
-       /* 16 */        Q+R, "SIGURG: urgent condition on socket",
+       /* 16 */        Q+I+R, "SIGURG: urgent condition on socket",
        /* 17 */        0, "SIGSTOP: stop",
-       /* 18 */        Q+R, "SIGTSTP: keyboard stop",
+       /* 18 */        Q+I+R, "SIGTSTP: keyboard stop",
        /* 19 */        0, "SIGCONT: continue after stop",
        /* 20 */        I+R, "SIGCHLD: child status has changed",
-       /* 21 */        Q+R, "SIGTTIN: background read from tty",
-       /* 22 */        Q+R, "SIGTTOU: background write to tty",
-       /* 23 */        Q+R, "SIGIO: i/o now possible",
-       /* 24 */        Q+R, "SIGXCPU: cpu limit exceeded",
-       /* 25 */        Q+R, "SIGXFSZ: file size limit exceeded",
-       /* 26 */        Q+R, "SIGVTALRM: virtual alarm clock",
-       /* 27 */        Q+R, "SIGPROF: profiling alarm clock",
-       /* 28 */        Q+R, "SIGWINCH: window size change",
-       /* 29 */        Q+R, "SIGINFO: status request from keyboard",
-       /* 30 */        Q+R, "SIGUSR1: user-defined signal 1",
-       /* 31 */        Q+R, "SIGUSR2: user-defined signal 2",
+       /* 21 */        Q+I+R, "SIGTTIN: background read from tty",
+       /* 22 */        Q+I+R, "SIGTTOU: background write to tty",
+       /* 23 */        Q+I+R, "SIGIO: i/o now possible",
+       /* 24 */        Q+I+R, "SIGXCPU: cpu limit exceeded",
+       /* 25 */        Q+I+R, "SIGXFSZ: file size limit exceeded",
+       /* 26 */        Q+I+R, "SIGVTALRM: virtual alarm clock",
+       /* 27 */        Q+I+R, "SIGPROF: profiling alarm clock",
+       /* 28 */        Q+I+R, "SIGWINCH: window size change",
+       /* 29 */        Q+I+R, "SIGINFO: status request from keyboard",
+       /* 30 */        Q+I+R, "SIGUSR1: user-defined signal 1",
+       /* 31 */        Q+I+R, "SIGUSR2: user-defined signal 2",
 };
 #undef C
 #undef I
index 27cb73c5582c6f1d375113f806e68434611e9c93..85b165922b5393c2469cda9ad27decb729de46c1 100644 (file)
@@ -66,3 +66,7 @@ func Sigrecv() uint32
 
 // Signame returns a string describing the signal, or "" if the signal is unknown.
 func Signame(sig int32) string
+
+// Siginit enables receipt of signals via Sigrecv.  It should typically
+// be called during initialization.
+func Siginit()
index 7bad780844a894312d0d55bf6d00f0bbee41b8f5..d6877675a946ccddabf65ba234a2b6239ca4c826 100644 (file)
@@ -51,8 +51,9 @@ sighandler(int32 sig, Siginfo* info, void* context)
        Mcontext *mc;
 
        if(sigtab[sig].flags & SigQueue) {
-               sigsend(sig);
-               return;
+               if(sigsend(sig) || (sigtab[sig].flags & SigIgnore))
+                       return;
+               exit(2);        // SIGINT, SIGTERM, etc
        }
 
        if(panicking)   // traceback already printed
index ed03db1bcc6339bec76a96a992c362f4f78a170e..d59259b4f6e294f94395d612d21c61e667e4f384 100644 (file)
@@ -59,8 +59,9 @@ sighandler(int32 sig, Siginfo* info, void* context)
        Mcontext *mc;
 
        if(sigtab[sig].flags & SigQueue) {
-               sigsend(sig);
-               return;
+               if(sigsend(sig) || (sigtab[sig].flags & SigIgnore))
+                       return;
+               exit(2);        // SIGINT, SIGTERM, etc
        }
 
        if(panicking)   // traceback already printed
index 91ddef8889600616c1a6a3a257191d486c3a8502..b986bcb3a3da644721b36c0720b51ae1e7b98b22 100644 (file)
@@ -22,25 +22,25 @@ static SigTab sigtab[] = {
        /* 11 */        C, "SIGSEGV: segmentation violation",
        /* 12 */        C, "SIGSYS: bad system call",
        /* 13 */        I, "SIGPIPE: write to broken pipe",
-       /* 14 */        Q+R, "SIGALRM: alarm clock",
+       /* 14 */        Q+I+R, "SIGALRM: alarm clock",
        /* 15 */        Q+R, "SIGTERM: termination",
-       /* 16 */        Q+R, "SIGURG: urgent condition on socket",
+       /* 16 */        Q+I+R, "SIGURG: urgent condition on socket",
        /* 17 */        0, "SIGSTOP: stop, unblockable",
-       /* 18 */        Q+R, "SIGTSTP: stop from tty",
+       /* 18 */        Q+I+R, "SIGTSTP: stop from tty",
        /* 19 */        0, "SIGCONT: continue",
        /* 20 */        I+R, "SIGCHLD: child status has changed",
-       /* 21 */        Q+R, "SIGTTIN: background read from tty",
-       /* 22 */        Q+R, "SIGTTOU: background write to tty",
-       /* 23 */        Q+R, "SIGIO: i/o now possible",
-       /* 24 */        Q+R, "SIGXCPU: cpu limit exceeded",
-       /* 25 */        Q+R, "SIGXFSZ: file size limit exceeded",
-       /* 26 */        Q+R, "SIGVTALRM: virtual alarm clock",
-       /* 27 */        Q+R, "SIGPROF: profiling alarm clock",
-       /* 28 */        I+R, "SIGWINCH: window size change",
-       /* 29 */        Q+R, "SIGINFO: information request",
-       /* 30 */        Q+R, "SIGUSR1: user-defined signal 1",
-       /* 31 */        Q+R, "SIGUSR2: user-defined signal 2",
-       /* 32 */        Q+R, "SIGTHR: reserved",
+       /* 21 */        Q+I+R, "SIGTTIN: background read from tty",
+       /* 22 */        Q+I+R, "SIGTTOU: background write to tty",
+       /* 23 */        Q+I+R, "SIGIO: i/o now possible",
+       /* 24 */        Q+I+R, "SIGXCPU: cpu limit exceeded",
+       /* 25 */        Q+I+R, "SIGXFSZ: file size limit exceeded",
+       /* 26 */        Q+I+R, "SIGVTALRM: virtual alarm clock",
+       /* 27 */        Q+I+R, "SIGPROF: profiling alarm clock",
+       /* 28 */        Q+I+R, "SIGWINCH: window size change",
+       /* 29 */        Q+I+R, "SIGINFO: information request",
+       /* 30 */        Q+I+R, "SIGUSR1: user-defined signal 1",
+       /* 31 */        Q+I+R, "SIGUSR2: user-defined signal 2",
+       /* 32 */        Q+I+R, "SIGTHR: reserved",
 };
 #undef C
 #undef I
index 2e6c7a5ff05548c0acc669df898016b1c1257211..c5400830210ef6bd22bb76a7e98dcaaf73129d0a 100644 (file)
@@ -48,8 +48,9 @@ sighandler(int32 sig, Siginfo* info, void* context)
        Sigcontext *sc;
 
        if(sigtab[sig].flags & SigQueue) {
-               sigsend(sig);
-               return;
+               if(sigsend(sig) || (sigtab[sig].flags & SigIgnore))
+                       return;
+               exit(2);        // SIGINT, SIGTERM, etc
        }
 
        if(panicking)   // traceback already printed
index 693b8c7042c0fe57b2cc316372dd3d9eb3831c7c..dba6fb10dcdcfcf90349e6e626dced8425ee2f90 100644 (file)
@@ -57,8 +57,9 @@ sighandler(int32 sig, Siginfo* info, void* context)
        Sigcontext *sc;
 
        if(sigtab[sig].flags & SigQueue) {
-               sigsend(sig);
-               return;
+               if(sigsend(sig) || (sigtab[sig].flags & SigIgnore))
+                       return;
+               exit(2);        // SIGINT, SIGTERM, etc
        }
 
        if(panicking)   // traceback already printed
index 883ac4e04ae395f000b4d4a17c2dc7a0bae01870..3431cd218418fc64f2f7fac2816412c5c4d841e8 100644 (file)
@@ -18,27 +18,27 @@ static SigTab sigtab[] = {
        /* 7 */ C, "SIGBUS: bus error",
        /* 8 */ C, "SIGFPE: floating-point exception",
        /* 9 */ 0, "SIGKILL: kill",
-       /* 10 */        Q+R, "SIGUSR1: user-defined signal 1",
+       /* 10 */        Q+I+R, "SIGUSR1: user-defined signal 1",
        /* 11 */        C, "SIGSEGV: segmentation violation",
-       /* 12 */        Q+R, "SIGUSR2: user-defined signal 2",
+       /* 12 */        Q+I+R, "SIGUSR2: user-defined signal 2",
        /* 13 */        I, "SIGPIPE: write to broken pipe",
-       /* 14 */        Q+R, "SIGALRM: alarm clock",
+       /* 14 */        Q+I+R, "SIGALRM: alarm clock",
        /* 15 */        Q+R, "SIGTERM: termination",
-       /* 16 */        Q+R, "SIGSTKFLT: stack fault",
-       /* 17 */        Q+R, "SIGCHLD: child status has changed",
+       /* 16 */        C, "SIGSTKFLT: stack fault",
+       /* 17 */        I+R, "SIGCHLD: child status has changed",
        /* 18 */        0, "SIGCONT: continue",
        /* 19 */        0, "SIGSTOP: stop, unblockable",
-       /* 20 */        Q+R, "SIGTSTP: keyboard stop",
-       /* 21 */        Q+R, "SIGTTIN: background read from tty",
-       /* 22 */        Q+R, "SIGTTOU: background write to tty",
-       /* 23 */        Q+R, "SIGURG: urgent condition on socket",
-       /* 24 */        Q+R, "SIGXCPU: cpu limit exceeded",
-       /* 25 */        Q+R, "SIGXFSZ: file size limit exceeded",
-       /* 26 */        Q+R, "SIGVTALRM: virtual alarm clock",
-       /* 27 */        Q+R, "SIGPROF: profiling alarm clock",
-       /* 28 */        Q+R, "SIGWINCH: window size change",
-       /* 29 */        Q+R, "SIGIO: i/o now possible",
-       /* 30 */        Q+R, "SIGPWR: power failure restart",
+       /* 20 */        Q+I+R, "SIGTSTP: keyboard stop",
+       /* 21 */        Q+I+R, "SIGTTIN: background read from tty",
+       /* 22 */        Q+I+R, "SIGTTOU: background write to tty",
+       /* 23 */        Q+I+R, "SIGURG: urgent condition on socket",
+       /* 24 */        Q+I+R, "SIGXCPU: cpu limit exceeded",
+       /* 25 */        Q+I+R, "SIGXFSZ: file size limit exceeded",
+       /* 26 */        Q+I+R, "SIGVTALRM: virtual alarm clock",
+       /* 27 */        Q+I+R, "SIGPROF: profiling alarm clock",
+       /* 28 */        Q+I+R, "SIGWINCH: window size change",
+       /* 29 */        Q+I+R, "SIGIO: i/o now possible",
+       /* 30 */        Q+I+R, "SIGPWR: power failure restart",
        /* 31 */        C, "SIGSYS: bad system call",
 };
 #undef C
index 46df412b399c19c71922dfd875047bdffe576bf7..91130a0052eaccc841996e2a86358d927b9a60b6 100644 (file)
@@ -374,10 +374,10 @@ void      breakpoint(void);
 void   gosched(void);
 void   goexit(void);
 void   runcgo(void (*fn)(void*), void*);
-void   entersyscall(void);
-void   exitsyscall(void);
+void   runtimeĀ·entersyscall(void);
+void   runtimeĀ·exitsyscall(void);
 void   siginit(void);
-void   sigsend(int32 sig);
+bool   sigsend(int32 sig);
 
 #pragma        varargck        argpos  printf  1
 
index 059d3edd1cd1d5fee371ef5c89141aaffc8c3e3d..c3751c5d2761cdfdaf4eecf1b3decf8927982711 100644 (file)
@@ -43,6 +43,7 @@ package runtime
 static struct {
        Note;
        uint32 mask;
+       bool inuse;
 } sig;
 
 void
@@ -52,24 +53,27 @@ siginit(void)
 }
 
 // Called from sighandler to send a signal back out of the signal handling thread.
-void
+bool
 sigsend(int32 s)
 {
        uint32 bit, mask;
 
+       if(!sig.inuse)
+               return false;
        bit = 1 << s;
        for(;;) {
                mask = sig.mask;
                if(mask & bit)
-                       return;         // signal already in queue
+                       break;          // signal already in queue
                if(cas(&sig.mask, mask, mask|bit)) {
                        // Added to queue.
                        // Only send a wakeup for the first signal in each round.
                        if(mask == 0)
                                notewakeup(&sig);
-                       return;
+                       break;
                }
        }
+       return true;
 }
 
 // Called to receive a bitmask of queued signals.
@@ -88,3 +92,7 @@ func Sigrecv() (m uint32) {
 func Signame(sig int32) (name String) {
        name = signame(sig);
 }
+
+func Siginit() {
+       sig.inuse = true;       // enable reception of signals; cannot disable
+}