From b841fbd417873fda16fbf42d5c6a52cccef384dc Mon Sep 17 00:00:00 2001 From: ian Date: Fri, 12 Feb 2016 22:10:09 +0000 Subject: 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 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233393 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/go/gofrontend/MERGE | 2 +- libgo/runtime/go-libmain.c | 6 ++++-- libgo/runtime/proc.c | 2 +- libgo/runtime/runtime.h | 2 +- libgo/runtime/signal_unix.c | 10 +++++++++- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index fee516838cb..228dfc1360a 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -28a9dfbc3cda0bf7fd4f3fb1506c547f6cdf41a5 +22278c6e8ce3982b09111183bc6addf0184bef1f The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/libgo/runtime/go-libmain.c b/libgo/runtime/go-libmain.c index f578aab43b7..6884f3a5f56 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 cd926b4ea62..9ba199b8cae 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 34143e9a256..73c46e9117f 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 20289335f8d..5bee0d2a706 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); } -- cgit v1.2.1