--- /dev/null
+// Copyright 2024 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
+
+// Test case for issue 66427.
+// Running under TSAN, this fails with "signal handler
+// spoils errno".
+
+/*
+#include <pthread.h>
+#include <signal.h>
+#include <stdlib.h>
+
+void go_callback();
+
+static void *thr(void *arg) {
+ int i;
+ for (i = 0; i < 10; i++)
+ go_callback();
+ return 0;
+}
+
+static void *sendthr(void *arg) {
+ pthread_t th = *(pthread_t*)arg;
+ while (1) {
+ int r = pthread_kill(th, SIGWINCH);
+ if (r < 0)
+ break;
+ }
+ return 0;
+}
+
+static void foo() {
+ pthread_t *th = malloc(sizeof(pthread_t));
+ pthread_t th2;
+ pthread_create(th, 0, thr, 0);
+ pthread_create(&th2, 0, sendthr, th);
+ pthread_join(*th, 0);
+}
+*/
+import "C"
+
+import (
+ "time"
+)
+
+//export go_callback
+func go_callback() {}
+
+func main() {
+ go func() {
+ for {
+ C.foo()
+ }
+ }()
+
+ time.Sleep(1000 * time.Millisecond)
+}
{src: "tsan12.go", needsRuntime: true},
{src: "tsan13.go", needsRuntime: true},
{src: "tsan14.go", needsRuntime: true},
+ {src: "tsan15.go", needsRuntime: true},
}
for _, tc := range cases {
tc := tc