aboutsummaryrefslogtreecommitdiff
path: root/misc/cgo/testsanitizers/testdata/tsan11.go
diff options
context:
space:
mode:
authorBryan C. Mills <bcmills@google.com>2019-02-22 08:36:41 -0500
committerBryan C. Mills <bcmills@google.com>2019-02-22 21:58:00 +0000
commit8f1e2d4ef7c8d415b0a2e4ae08e16e4722c795d5 (patch)
treee8d5f22e13a48ee23d640bb702476ab14bc382ff /misc/cgo/testsanitizers/testdata/tsan11.go
parenta00611f58d5322899c45c63758e43d2a2c5a2a11 (diff)
downloadgo-8f1e2d4ef7c8d415b0a2e4ae08e16e4722c795d5.tar.gz
go-8f1e2d4ef7c8d415b0a2e4ae08e16e4722c795d5.zip
misc/cgo/testsanitizers: move test source files into testdata directory
If we run 'go test ./...' in the misc module, we don't want to see errors for these standalone files. We could instead add +ignore tags to each file individually, but this is exactly what a testdata directory is for. Updates #30228 Change-Id: I7047ad888dd6aff701f5982d58b6a79f6a487c58 Reviewed-on: https://go-review.googlesource.com/c/163417 Run-TryBot: Bryan C. Mills <bcmills@google.com> Reviewed-by: Jay Conrod <jayconrod@google.com>
Diffstat (limited to 'misc/cgo/testsanitizers/testdata/tsan11.go')
-rw-r--r--misc/cgo/testsanitizers/testdata/tsan11.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/misc/cgo/testsanitizers/testdata/tsan11.go b/misc/cgo/testsanitizers/testdata/tsan11.go
new file mode 100644
index 0000000000..70ac9c8ae2
--- /dev/null
+++ b/misc/cgo/testsanitizers/testdata/tsan11.go
@@ -0,0 +1,55 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// This program hung when run under the C/C++ ThreadSanitizer. TSAN defers
+// asynchronous signals until the signaled thread calls into libc. The runtime's
+// sysmon goroutine idles itself using direct usleep syscalls, so it could
+// run for an arbitrarily long time without triggering the libc interceptors.
+// See https://golang.org/issue/18717.
+
+import (
+ "os"
+ "os/signal"
+ "syscall"
+)
+
+/*
+#cgo CFLAGS: -g -fsanitize=thread
+#cgo LDFLAGS: -g -fsanitize=thread
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static void raise_usr2(int signo) {
+ raise(SIGUSR2);
+}
+
+static void register_handler(int signo) {
+ struct sigaction sa;
+ memset(&sa, 0, sizeof(sa));
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = SA_ONSTACK;
+ sa.sa_handler = raise_usr2;
+
+ if (sigaction(SIGUSR1, &sa, NULL) != 0) {
+ perror("failed to register SIGUSR1 handler");
+ exit(EXIT_FAILURE);
+ }
+}
+*/
+import "C"
+
+func main() {
+ ch := make(chan os.Signal)
+ signal.Notify(ch, syscall.SIGUSR2)
+
+ C.register_handler(C.int(syscall.SIGUSR1))
+ syscall.Kill(syscall.Getpid(), syscall.SIGUSR1)
+
+ <-ch
+}