diff options
author | Rowan Worth <sqweek@gmail.com> | 2014-01-09 09:34:04 -0800 |
---|---|---|
committer | Rowan Worth <sqweek@gmail.com> | 2014-01-09 09:34:04 -0800 |
commit | 9ebddd3b73baafc85e8e8eb75484b255ab695c5c (patch) | |
tree | 0d6373dfe17ec926ef0abfee6ac8031163318b59 /misc/cgo | |
parent | 5db980fd147b4b5169333ea3d47e5a1bb812a3c9 (diff) | |
download | go-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.go | 1 | ||||
-rw-r--r-- | misc/cgo/test/issue6997_linux.c | 26 | ||||
-rw-r--r-- | misc/cgo/test/issue6997_linux.go | 40 |
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") + } +} |