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 5package main 6 7/* 8#include <signal.h> 9#include <unistd.h> 10#include <stdlib.h> 11#include <stdio.h> 12 13// Raise SIGPIPE. 14static 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*/ 31import "C" 32 33import ( 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 44func 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 56func Block() { 57 select {} 58} 59 60var P *byte 61 62// TestSEGV makes sure that an invalid address turns into a run-time Go panic. 63// 64//export TestSEGV 65func 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 80func Noop() { 81} 82 83// Raise SIGPIPE. 84// 85//export GoRaiseSIGPIPE 86func GoRaiseSIGPIPE() { 87 C.CRaiseSIGPIPE() 88} 89 90func main() { 91} 92