diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2016-02-12 22:10:09 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2016-02-12 22:10:09 +0000 |
commit | 54c9c975f182aacae65a925b86b8770e2503b950 (patch) | |
tree | 0f1bf2665d8697cd161c1f9d5271e3db262ac73e /libgo/runtime | |
parent | 37064e3daf756e60b7725b8fee74ddb6785511ac (diff) | |
download | gcc-54c9c975f182aacae65a925b86b8770e2503b950.zip gcc-54c9c975f182aacae65a925b86b8770e2503b950.tar.gz gcc-54c9c975f182aacae65a925b86b8770e2503b950.tar.bz2 |
runtime: For c-archive/c-shared, install signal handlers synchronously.
This is a port of https://golang.org/cl/18150 to the gccgo runtime.
The previous behaviour of installing the signal handlers in a separate
thread meant that Go initialization raced with non-Go initialization if
the non-Go initialization also wanted to install signal handlers. Make
installing signal handlers synchronous so that the process-wide behavior
is predictable.
Reviewed-on: https://go-review.googlesource.com/19494
From-SVN: r233393
Diffstat (limited to 'libgo/runtime')
-rw-r--r-- | libgo/runtime/go-libmain.c | 6 | ||||
-rw-r--r-- | libgo/runtime/proc.c | 2 | ||||
-rw-r--r-- | libgo/runtime/runtime.h | 2 | ||||
-rw-r--r-- | libgo/runtime/signal_unix.c | 10 |
4 files changed, 15 insertions, 5 deletions
diff --git a/libgo/runtime/go-libmain.c b/libgo/runtime/go-libmain.c index f578aab..6884f3a 100644 --- a/libgo/runtime/go-libmain.c +++ b/libgo/runtime/go-libmain.c @@ -59,6 +59,10 @@ initfn (int argc, char **argv, char** env __attribute__ ((unused))) struct args *a; pthread_t tid; + runtime_isarchive = true; + + runtime_initsig(true); + a = (struct args *) malloc (sizeof *a); if (a == NULL) die ("malloc", errno); @@ -88,8 +92,6 @@ gostart (void *arg) { struct args *a = (struct args *) arg; - runtime_isarchive = true; - if (runtime_isstarted) return NULL; runtime_isstarted = true; diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c index cd926b4..9ba199b 100644 --- a/libgo/runtime/proc.c +++ b/libgo/runtime/proc.c @@ -1093,7 +1093,7 @@ runtime_mstart(void* mp) runtime_newextram(); runtime_needextram = 0; } - runtime_initsig(); + runtime_initsig(false); } if(m->mstartfn) diff --git a/libgo/runtime/runtime.h b/libgo/runtime/runtime.h index 34143e9..73c46e9 100644 --- a/libgo/runtime/runtime.h +++ b/libgo/runtime/runtime.h @@ -550,7 +550,7 @@ void* runtime_mal(uintptr); String runtime_gostring(const byte*); String runtime_gostringnocopy(const byte*); void runtime_schedinit(void); -void runtime_initsig(void); +void runtime_initsig(bool); void runtime_sigenable(uint32 sig); void runtime_sigdisable(uint32 sig); void runtime_sigignore(uint32 sig); diff --git a/libgo/runtime/signal_unix.c b/libgo/runtime/signal_unix.c index 2028933..5bee0d2 100644 --- a/libgo/runtime/signal_unix.c +++ b/libgo/runtime/signal_unix.c @@ -13,11 +13,16 @@ extern SigTab runtime_sigtab[]; void -runtime_initsig(void) +runtime_initsig(bool preinit) { int32 i; SigTab *t; + // For c-archive/c-shared this is called by go-libmain.c with + // preinit == true. + if(runtime_isarchive && !preinit) + return; + // First call: basic setup. for(i = 0; runtime_sigtab[i].sig != -1; i++) { t = &runtime_sigtab[i]; @@ -37,6 +42,9 @@ runtime_initsig(void) } } + if(runtime_isarchive && (t->flags&SigPanic) == 0) + continue; + t->flags |= SigHandling; runtime_setsig(i, runtime_sighandler, true); } |