diff options
| author | Ian Lance Taylor <iant@golang.org> | 2013-12-24 08:08:15 -0800 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2013-12-24 08:08:15 -0800 |
| commit | 699dbb60b7274a525f53797aa1d145cc762cf953 (patch) | |
| tree | f6fcb516b9be89921270cab24707f336f2d118a5 /src/pkg | |
| parent | 7413e48d5beeae3fa0b22fecf39cf1db5a1339f7 (diff) | |
| download | go-699dbb60b7274a525f53797aa1d145cc762cf953.tar.xz | |
runtime/cgo: always set signal mask before calling pthread_create
This was done correctly for most targets but was missing from
FreeBSD/ARM and Linux/ARM.
R=golang-codereviews, dave
CC=golang-codereviews
https://golang.org/cl/45180043
Diffstat (limited to 'src/pkg')
| -rw-r--r-- | src/pkg/runtime/cgo/gcc_freebsd_arm.c | 7 | ||||
| -rw-r--r-- | src/pkg/runtime/cgo/gcc_linux_arm.c | 7 |
2 files changed, 14 insertions, 0 deletions
diff --git a/src/pkg/runtime/cgo/gcc_freebsd_arm.c b/src/pkg/runtime/cgo/gcc_freebsd_arm.c index 211dca75cb..6e0f3b55bc 100644 --- a/src/pkg/runtime/cgo/gcc_freebsd_arm.c +++ b/src/pkg/runtime/cgo/gcc_freebsd_arm.c @@ -39,10 +39,14 @@ void _cgo_sys_thread_start(ThreadStart *ts) { pthread_attr_t attr; + sigset_t ign, oset; pthread_t p; size_t size; int err; + SIGFILLSET(ign); + pthread_sigmask(SIG_SETMASK, &ign, &oset); + // Not sure why the memset is necessary here, // but without it, we get a bogus stack size // out of pthread_attr_getstacksize. C'est la Linux. @@ -52,6 +56,9 @@ _cgo_sys_thread_start(ThreadStart *ts) pthread_attr_getstacksize(&attr, &size); ts->g->stackguard = size; err = pthread_create(&p, &attr, threadentry, ts); + + pthread_sigmask(SIG_SETMASK, &oset, nil); + if (err != 0) { fprintf(stderr, "runtime/cgo: pthread_create failed: %s\n", strerror(err)); abort(); diff --git a/src/pkg/runtime/cgo/gcc_linux_arm.c b/src/pkg/runtime/cgo/gcc_linux_arm.c index 9a6e585948..5edf537dd4 100644 --- a/src/pkg/runtime/cgo/gcc_linux_arm.c +++ b/src/pkg/runtime/cgo/gcc_linux_arm.c @@ -28,10 +28,14 @@ void _cgo_sys_thread_start(ThreadStart *ts) { pthread_attr_t attr; + sigset_t ign, oset; pthread_t p; size_t size; int err; + sigfillset(&ign); + pthread_sigmask(SIG_SETMASK, &ign, &oset); + // Not sure why the memset is necessary here, // but without it, we get a bogus stack size // out of pthread_attr_getstacksize. C'est la Linux. @@ -41,6 +45,9 @@ _cgo_sys_thread_start(ThreadStart *ts) pthread_attr_getstacksize(&attr, &size); ts->g->stackguard = size; err = pthread_create(&p, &attr, threadentry, ts); + + pthread_sigmask(SIG_SETMASK, &oset, nil); + if (err != 0) { fprintf(stderr, "runtime/cgo: pthread_create failed: %s\n", strerror(err)); abort(); |
