Commit e259a3f2 by Ian Lance Taylor

runtime: Block signals when creating a new thread.

From-SVN: r195619
parent 3b35cd04
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
#include <limits.h> #include <limits.h>
#include <signal.h>
#include <stdlib.h> #include <stdlib.h>
#include <pthread.h> #include <pthread.h>
#include <unistd.h> #include <unistd.h>
...@@ -1217,6 +1218,9 @@ runtime_newm(void) ...@@ -1217,6 +1218,9 @@ runtime_newm(void)
pthread_attr_t attr; pthread_attr_t attr;
pthread_t tid; pthread_t tid;
size_t stacksize; size_t stacksize;
sigset_t clear;
sigset_t old;
int ret;
#if 0 #if 0
static const Type *mtype; // The Go type M static const Type *mtype; // The Go type M
...@@ -1249,7 +1253,15 @@ runtime_newm(void) ...@@ -1249,7 +1253,15 @@ runtime_newm(void)
if(pthread_attr_setstacksize(&attr, stacksize) != 0) if(pthread_attr_setstacksize(&attr, stacksize) != 0)
runtime_throw("pthread_attr_setstacksize"); 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"); runtime_throw("pthread_create");
return mp; return mp;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment