diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2013-01-31 17:30:28 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2013-01-31 17:30:28 +0000 |
commit | e259a3f2ca40d51e7d7c1ccb2a09ec06ca52d320 (patch) | |
tree | 174429a76d5ac9c87abb2dd2e798fa9d5049fe51 /libgo/runtime | |
parent | 3b35cd045fa64576748bec13214631de1a9d8e07 (diff) | |
download | gcc-e259a3f2ca40d51e7d7c1ccb2a09ec06ca52d320.zip gcc-e259a3f2ca40d51e7d7c1ccb2a09ec06ca52d320.tar.gz gcc-e259a3f2ca40d51e7d7c1ccb2a09ec06ca52d320.tar.bz2 |
runtime: Block signals when creating a new thread.
From-SVN: r195619
Diffstat (limited to 'libgo/runtime')
-rw-r--r-- | libgo/runtime/proc.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c index 6d90076..b59f4ac 100644 --- a/libgo/runtime/proc.c +++ b/libgo/runtime/proc.c @@ -3,6 +3,7 @@ // license that can be found in the LICENSE file. #include <limits.h> +#include <signal.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> @@ -1217,6 +1218,9 @@ runtime_newm(void) pthread_attr_t attr; pthread_t tid; size_t stacksize; + sigset_t clear; + sigset_t old; + int ret; #if 0 static const Type *mtype; // The Go type M @@ -1249,7 +1253,15 @@ runtime_newm(void) if(pthread_attr_setstacksize(&attr, stacksize) != 0) runtime_throw("pthread_attr_setstacksize"); - if(pthread_create(&tid, &attr, runtime_mstart, mp) != 0) + // Block signals during pthread_create so that the new thread + // starts with signals disabled. It will enable them in minit. + sigfillset(&clear); + sigemptyset(&old); + sigprocmask(SIG_BLOCK, &clear, &old); + ret = pthread_create(&tid, &attr, runtime_mstart, mp); + sigprocmask(SIG_SETMASK, &old, nil); + + if (ret != 0) runtime_throw("pthread_create"); return mp; |