summaryrefslogtreecommitdiff
path: root/misc/cgo
diff options
context:
space:
mode:
authorRowan Worth <sqweek@gmail.com>2014-01-09 09:34:04 -0800
committerRowan Worth <sqweek@gmail.com>2014-01-09 09:34:04 -0800
commit9ebddd3b73baafc85e8e8eb75484b255ab695c5c (patch)
tree0d6373dfe17ec926ef0abfee6ac8031163318b59 /misc/cgo
parent5db980fd147b4b5169333ea3d47e5a1bb812a3c9 (diff)
downloadgo-9ebddd3b73baafc85e8e8eb75484b255ab695c5c.tar.gz
runtime: co-exist with NPTL's pthread_cancel.
NPTL uses SIGRTMIN (signal 32) to effect thread cancellation. Go's runtime replaces NPTL's signal handler with its own, and ends up aborting if a C library that ends up calling pthread_cancel is used. This patch prevents runtime from replacing NPTL's handler. Fixes issue 6997. R=golang-codereviews, iant, dvyukov CC=golang-codereviews https://codereview.appspot.com/47540043 Committer: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'misc/cgo')
-rw-r--r--misc/cgo/test/cgo_linux_test.go1
-rw-r--r--misc/cgo/test/issue6997_linux.c26
-rw-r--r--misc/cgo/test/issue6997_linux.go40
3 files changed, 67 insertions, 0 deletions
diff --git a/misc/cgo/test/cgo_linux_test.go b/misc/cgo/test/cgo_linux_test.go
index 056d67c96..0a405c7a3 100644
--- a/misc/cgo/test/cgo_linux_test.go
+++ b/misc/cgo/test/cgo_linux_test.go
@@ -7,3 +7,4 @@ package cgotest
import "testing"
func TestSetgid(t *testing.T) { testSetgid(t) }
+func Test6997(t *testing.T) { test6997(t) }
diff --git a/misc/cgo/test/issue6997_linux.c b/misc/cgo/test/issue6997_linux.c
new file mode 100644
index 000000000..897cdd081
--- /dev/null
+++ b/misc/cgo/test/issue6997_linux.c
@@ -0,0 +1,26 @@
+// Copyright 2014 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.
+
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+
+static pthread_t thread;
+
+static void* threadfunc(void* dummy) {
+ while(1) {
+ sleep(1);
+ }
+}
+
+int StartThread() {
+ return pthread_create(&thread, NULL, &threadfunc, NULL);
+}
+
+int CancelThread() {
+ void *r;
+ pthread_cancel(thread);
+ pthread_join(thread, &r);
+ return (r == PTHREAD_CANCELED);
+}
diff --git a/misc/cgo/test/issue6997_linux.go b/misc/cgo/test/issue6997_linux.go
new file mode 100644
index 000000000..871bd517a
--- /dev/null
+++ b/misc/cgo/test/issue6997_linux.go
@@ -0,0 +1,40 @@
+// Copyright 2014 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.
+
+// Test that pthread_cancel works as expected
+// (NPTL uses SIGRTMIN to implement thread cancellation)
+// See http://golang.org/issue/6997
+package cgotest
+
+/*
+#cgo CFLAGS: -pthread
+#cgo LDFLAGS: -pthread
+extern int StartThread();
+extern int CancelThread();
+*/
+import "C"
+
+import "testing"
+import "time"
+
+func test6997(t *testing.T) {
+ r := C.StartThread()
+ if r != 0 {
+ t.Error("pthread_create failed")
+ }
+ c := make(chan C.int)
+ go func() {
+ time.Sleep(500 * time.Millisecond)
+ c <- C.CancelThread()
+ }()
+
+ select {
+ case r = <-c:
+ if r == 0 {
+ t.Error("pthread finished but wasn't cancelled??")
+ }
+ case <-time.After(5 * time.Second):
+ t.Error("hung in pthread_cancel/pthread_join")
+ }
+}