]> Cypherpunks repositories - gostls13.git/commitdiff
Revert "runtime: handle SIGPIPE in c-archive and c-shared programs"
authorElias Naur <elias.naur@gmail.com>
Thu, 1 Dec 2016 09:31:08 +0000 (09:31 +0000)
committerElias Naur <elias.naur@gmail.com>
Thu, 1 Dec 2016 11:23:17 +0000 (11:23 +0000)
This reverts commit d24b57a6a1a3530e590b7c0a72dc78043e198630.

Reason for revert: Further complications arised (issue 18100). We'll try again in Go 1.9.

Change-Id: I5ca93d2643a4be877dd9c2d8df3359718440f02f
Reviewed-on: https://go-review.googlesource.com/33770
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Minux Ma <minux@golang.org>
Run-TryBot: Minux Ma <minux@golang.org>

misc/cgo/testcarchive/carchive_test.go
misc/cgo/testcarchive/main2.c
misc/cgo/testcarchive/main3.c
misc/cgo/testcarchive/main5.c
misc/cgo/testcarchive/src/libgo2/libgo2.go
misc/cgo/testcarchive/src/libgo3/libgo3.go
src/os/signal/doc.go
src/runtime/signal_unix.go

index 3c768a0ef349a92925a70ade18caf5ba35b4fac9..499992977517ea7aacdcf86aa437562950696fac 100644 (file)
@@ -265,25 +265,6 @@ func TestSignalForwarding(t *testing.T) {
                t.Logf("%s", out)
                t.Errorf("got %v; expected SIGSEGV", ee)
        }
-
-       // Test SIGPIPE forwarding
-       cmd = exec.Command(bin[0], append(bin[1:], "3")...)
-
-       out, err = cmd.CombinedOutput()
-
-       if err == nil {
-               t.Logf("%s", out)
-               t.Error("test program succeeded unexpectedly")
-       } else if ee, ok := err.(*exec.ExitError); !ok {
-               t.Logf("%s", out)
-               t.Errorf("error (%v) has type %T; expected exec.ExitError", err, err)
-       } else if ws, ok := ee.Sys().(syscall.WaitStatus); !ok {
-               t.Logf("%s", out)
-               t.Errorf("error.Sys (%v) has type %T; expected syscall.WaitStatus", ee.Sys(), ee.Sys())
-       } else if !ws.Signaled() || ws.Signal() != syscall.SIGPIPE {
-               t.Logf("%s", out)
-               t.Errorf("got %v; expected SIGPIPE", ee)
-       }
 }
 
 func TestSignalForwardingExternal(t *testing.T) {
index 55625c543a1b242360e7675d6a087441a1a47c92..774e014a1620967269a99eba962b175b69382c8f 100644 (file)
@@ -17,7 +17,6 @@
 #include <unistd.h>
 #include <sched.h>
 #include <time.h>
-#include <errno.h>
 
 #include "libgo2.h"
 
@@ -27,7 +26,6 @@ static void die(const char* msg) {
 }
 
 static volatile sig_atomic_t sigioSeen;
-static volatile sig_atomic_t sigpipeSeen;
 
 // Use up some stack space.
 static void recur(int i, char *p) {
@@ -39,11 +37,6 @@ static void recur(int i, char *p) {
        }
 }
 
-// Signal handler that uses up more stack space than a goroutine will have.
-static void pipeHandler(int signo, siginfo_t* info, void* ctxt) {
-       sigpipeSeen = 1;
-}
-
 // Signal handler that uses up more stack space than a goroutine will have.
 static void ioHandler(int signo, siginfo_t* info, void* ctxt) {
        char a[1024];
@@ -113,10 +106,6 @@ static void init() {
                die("sigaction");
        }
 
-       sa.sa_sigaction = pipeHandler;
-       if (sigaction(SIGPIPE, &sa, NULL) < 0) {
-               die("sigaction");
-       }
 }
 
 int main(int argc, char** argv) {
@@ -178,30 +167,7 @@ int main(int argc, char** argv) {
                nanosleep(&ts, NULL);
                i++;
                if (i > 5000) {
-                       fprintf(stderr, "looping too long waiting for SIGIO\n");
-                       exit(EXIT_FAILURE);
-               }
-       }
-
-       if (verbose) {
-               printf("provoking SIGPIPE\n");
-       }
-
-       GoRaiseSIGPIPE();
-
-       if (verbose) {
-               printf("waiting for sigpipeSeen\n");
-       }
-
-       // Wait until the signal has been delivered.
-       i = 0;
-       while (!sigpipeSeen) {
-               ts.tv_sec = 0;
-               ts.tv_nsec = 1000000;
-               nanosleep(&ts, NULL);
-               i++;
-               if (i > 1000) {
-                       fprintf(stderr, "looping too long waiting for SIGPIPE\n");
+                       fprintf(stderr, "looping too long waiting for signal\n");
                        exit(EXIT_FAILURE);
                }
        }
index 07d5d1e64ef0cc30af3fda59043a3991841269f8..0a6c0d3f74e077b01fa7834d9f415f7acb1ea9d0 100644 (file)
@@ -34,13 +34,6 @@ int main(int argc, char** argv) {
        verbose = argc > 2;
        setvbuf(stdout, NULL, _IONBF, 0);
 
-       if (verbose) {
-               printf("raising SIGPIPE\n");
-       }
-
-       // Test that the Go runtime handles SIGPIPE.
-       ProvokeSIGPIPE();
-
        if (verbose) {
                printf("calling sigaction\n");
        }
index 2437bf07c58f8f530bf42e5b6dac9396fdf26b34..9fadf0801e10c996b2f48b6876d5b491a9984030 100644 (file)
@@ -68,24 +68,6 @@ int main(int argc, char** argv) {
 
                        break;
                }
-               case 3: {
-                       if (verbose) {
-                               printf("attempting SIGPIPE\n");
-                       }
-
-                       int fd[2];
-                       if (pipe(fd) != 0) {
-                               printf("pipe(2) failed\n");
-                               return 0;
-                       }
-                       // Close the reading end.
-                       close(fd[0]);
-                       // Expect that write(2) fails (EPIPE)
-                       if (write(fd[1], "some data", 9) != -1) {
-                               printf("write(2) unexpectedly succeeded\n");
-                               return 0;
-                       }
-               }
                default:
                        printf("Unknown test: %d\n", test);
                        return 0;
index 19c8e1a6dcb8e8dd8c13d24f778a8685f3c113e8..fbed493b93ff20463d25cf71f81f554a0ac728f3 100644 (file)
@@ -4,30 +4,6 @@
 
 package main
 
-/*
-#include <signal.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-// Raise SIGPIPE.
-static void CRaiseSIGPIPE() {
-       int fds[2];
-
-       if (pipe(fds) == -1) {
-               perror("pipe");
-               exit(EXIT_FAILURE);
-       }
-       // Close the reader end
-       close(fds[0]);
-       // Write to the writer end to provoke a SIGPIPE
-       if (write(fds[1], "some data", 9) != -1) {
-               fprintf(stderr, "write to a closed pipe succeeded\n");
-               exit(EXIT_FAILURE);
-       }
-       close(fds[1]);
-}
-*/
 import "C"
 
 import (
@@ -70,11 +46,5 @@ func TestSEGV() {
 func Noop() {
 }
 
-// Raise SIGPIPE.
-//export GoRaiseSIGPIPE
-func GoRaiseSIGPIPE() {
-       C.CRaiseSIGPIPE()
-}
-
 func main() {
 }
index 19fcc7f34603afa0bc2a8ba58123d00d51e084cd..94e5d21c14a83c3019ef4ba09b17fc3222e7e7be 100644 (file)
@@ -40,17 +40,5 @@ func SawSIGIO() C.int {
        }
 }
 
-// ProvokeSIGPIPE provokes a kernel-initiated SIGPIPE
-//export ProvokeSIGPIPE
-func ProvokeSIGPIPE() {
-       r, w, err := os.Pipe()
-       if err != nil {
-               panic(err)
-       }
-       r.Close()
-       defer w.Close()
-       w.Write([]byte("some data"))
-}
-
 func main() {
 }
index 16f49c7ab8be17d0e9b24261ebc20ed99228f839..73b01a2764de60667979964bb3cc3ad21d677f6d 100644 (file)
@@ -181,11 +181,10 @@ If the Go runtime sees an existing signal handler for the SIGCANCEL or
 SIGSETXID signals (which are used only on GNU/Linux), it will turn on
 the SA_ONSTACK flag and otherwise keep the signal handler.
 
-For the synchronous signals and SIGPIPE, the Go runtime will install a
-signal handler. It will save any existing signal handler. If a
-synchronous signal arrives while executing non-Go code, the Go runtime
-will invoke the existing signal handler instead of the Go signal
-handler.
+For the synchronous signals, the Go runtime will install a signal
+handler. It will save any existing signal handler. If a synchronous
+signal arrives while executing non-Go code, the Go runtime will invoke
+the existing signal handler instead of the Go signal handler.
 
 Go code built with -buildmode=c-archive or -buildmode=c-shared will
 not install any other signal handlers by default. If there is an
index 78381e58d7ad86f51ad659accef06d35019d2b0b..19173ac2117259e53a1db60b4bbedf47d52c4a7e 100644 (file)
@@ -111,8 +111,8 @@ func sigInstallGoHandler(sig uint32) bool {
        }
 
        // When built using c-archive or c-shared, only install signal
-       // handlers for synchronous signals and SIGPIPE.
-       if (isarchive || islibrary) && t.flags&_SigPanic == 0 && sig != _SIGPIPE {
+       // handlers for synchronous signals.
+       if (isarchive || islibrary) && t.flags&_SigPanic == 0 {
                return false
        }
 
@@ -497,15 +497,9 @@ func sigfwdgo(sig uint32, info *siginfo, ctx unsafe.Pointer) bool {
                return true
        }
 
+       // Only forward synchronous signals.
        c := &sigctxt{info, ctx}
-       // Only forward signals from the kernel.
-       // On Linux and Darwin there is no way to distinguish a SIGPIPE raised by a write
-       // to a closed socket or pipe from a SIGPIPE raised by kill or pthread_kill
-       // so we'll treat every SIGPIPE as kernel-generated.
-       userSig := c.sigcode() == _SI_USER &&
-               (sig != _SIGPIPE || GOOS != "linux" && GOOS != "android" && GOOS != "darwin")
-       // Only forward synchronous signals and SIGPIPE.
-       if userSig || flags&_SigPanic == 0 && sig != _SIGPIPE {
+       if c.sigcode() == _SI_USER || flags&_SigPanic == 0 {
                return false
        }
        // Determine if the signal occurred inside Go code. We test that: