1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 /* 8 #include <signal.h> 9 #include <unistd.h> 10 #include <stdlib.h> 11 #include <stdio.h> 12 13 // Raise SIGPIPE. 14 static void CRaiseSIGPIPE() { 15 int fds[2]; 16 17 if (pipe(fds) == -1) { 18 perror("pipe"); 19 exit(EXIT_FAILURE); 20 } 21 // Close the reader end 22 close(fds[0]); 23 // Write to the writer end to provoke a SIGPIPE 24 if (write(fds[1], "some data", 9) != -1) { 25 fprintf(stderr, "write to a closed pipe succeeded\n"); 26 exit(EXIT_FAILURE); 27 } 28 close(fds[1]); 29 } 30 */ 31 import "C" 32 33 import ( 34 "fmt" 35 "os" 36 "runtime" 37 ) 38 39 // RunGoroutines starts some goroutines that don't do anything. 40 // The idea is to get some threads going, so that a signal will be delivered 41 // to a thread started by Go. 42 // 43 //export RunGoroutines 44 func RunGoroutines() { 45 for i := 0; i < 4; i++ { 46 go func() { 47 runtime.LockOSThread() 48 select {} 49 }() 50 } 51 } 52 53 // Block blocks the current thread while running Go code. 54 // 55 //export Block 56 func Block() { 57 select {} 58 } 59 60 var P *byte 61 62 // TestSEGV makes sure that an invalid address turns into a run-time Go panic. 63 // 64 //export TestSEGV 65 func TestSEGV() { 66 defer func() { 67 if recover() == nil { 68 fmt.Fprintln(os.Stderr, "no panic from segv") 69 os.Exit(1) 70 } 71 }() 72 *P = 0 73 fmt.Fprintln(os.Stderr, "continued after segv") 74 os.Exit(1) 75 } 76 77 // Noop ensures that the Go runtime is initialized. 78 // 79 //export Noop 80 func Noop() { 81 } 82 83 // Raise SIGPIPE. 84 // 85 //export GoRaiseSIGPIPE 86 func GoRaiseSIGPIPE() { 87 C.CRaiseSIGPIPE() 88 } 89 90 func main() { 91 } 92