]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/cgo: always set signal mask before calling pthread_create
authorIan Lance Taylor <iant@golang.org>
Tue, 24 Dec 2013 16:08:15 +0000 (08:08 -0800)
committerIan Lance Taylor <iant@golang.org>
Tue, 24 Dec 2013 16:08:15 +0000 (08:08 -0800)
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

src/pkg/runtime/cgo/gcc_freebsd_arm.c
src/pkg/runtime/cgo/gcc_linux_arm.c

index 211dca75cbe6c56308c5a3f7e485ff80cefd6d9f..6e0f3b55bcbce83d5d033cae58321e0192f8d67c 100644 (file)
@@ -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();
index 9a6e585948a62c68b78ead7e5a272bfd22900096..5edf537dd46ead902d6f161a23d1197966202646 100644 (file)
@@ -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();