From 1fc9a17c7ea276ee80045dc8cc9411eb024cf8ea Mon Sep 17 00:00:00 2001 From: Mikio Hara <mikioh.mikioh@gmail.com> Date: Wed, 14 Mar 2012 12:49:59 +0900 Subject: [PATCH] runtime/cgo: darwin signal masking Fixes #3101 (again). R=golang-dev, rsc CC=golang-dev https://golang.org/cl/5825043 --- src/pkg/runtime/cgo/gcc_darwin_386.c | 8 ++++++++ src/pkg/runtime/cgo/gcc_darwin_amd64.c | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/pkg/runtime/cgo/gcc_darwin_386.c b/src/pkg/runtime/cgo/gcc_darwin_386.c index d9f25347a5..2c30c666fc 100644 --- a/src/pkg/runtime/cgo/gcc_darwin_386.c +++ b/src/pkg/runtime/cgo/gcc_darwin_386.c @@ -4,6 +4,7 @@ #include <string.h> /* for strerror */ #include <pthread.h> +#include <signal.h> #include "libcgo.h" static void* threadentry(void*); @@ -120,14 +121,21 @@ void libcgo_sys_thread_start(ThreadStart *ts) { pthread_attr_t attr; + sigset_t ign, oset; pthread_t p; size_t size; int err; + sigfillset(&ign); + sigprocmask(SIG_SETMASK, &ign, &oset); + pthread_attr_init(&attr); pthread_attr_getstacksize(&attr, &size); ts->g->stackguard = size; err = pthread_create(&p, &attr, threadentry, ts); + + sigprocmask(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_darwin_amd64.c b/src/pkg/runtime/cgo/gcc_darwin_amd64.c index a0b026ee2b..89dc7a4e8e 100644 --- a/src/pkg/runtime/cgo/gcc_darwin_amd64.c +++ b/src/pkg/runtime/cgo/gcc_darwin_amd64.c @@ -4,6 +4,7 @@ #include <string.h> /* for strerror */ #include <pthread.h> +#include <signal.h> #include "libcgo.h" static void* threadentry(void*); @@ -90,14 +91,21 @@ void libcgo_sys_thread_start(ThreadStart *ts) { pthread_attr_t attr; + sigset_t ign, oset; pthread_t p; size_t size; int err; + sigfillset(&ign); + sigprocmask(SIG_SETMASK, &ign, &oset); + pthread_attr_init(&attr); pthread_attr_getstacksize(&attr, &size); ts->g->stackguard = size; err = pthread_create(&p, &attr, threadentry, ts); + + sigprocmask(SIG_SETMASK, &oset, nil); + if (err != 0) { fprintf(stderr, "runtime/cgo: pthread_create failed: %s\n", strerror(err)); abort(); -- 2.30.9