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
This commit is contained in:
Ian Lance Taylor 2016-02-12 22:10:09 +00:00
parent 37064e3daf
commit 54c9c975f1
5 changed files with 16 additions and 6 deletions

View File

@ -1,4 +1,4 @@
28a9dfbc3cda0bf7fd4f3fb1506c547f6cdf41a5 22278c6e8ce3982b09111183bc6addf0184bef1f
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.

View File

@ -59,6 +59,10 @@ initfn (int argc, char **argv, char** env __attribute__ ((unused)))
struct args *a; struct args *a;
pthread_t tid; pthread_t tid;
runtime_isarchive = true;
runtime_initsig(true);
a = (struct args *) malloc (sizeof *a); a = (struct args *) malloc (sizeof *a);
if (a == NULL) if (a == NULL)
die ("malloc", errno); die ("malloc", errno);
@ -88,8 +92,6 @@ gostart (void *arg)
{ {
struct args *a = (struct args *) arg; struct args *a = (struct args *) arg;
runtime_isarchive = true;
if (runtime_isstarted) if (runtime_isstarted)
return NULL; return NULL;
runtime_isstarted = true; runtime_isstarted = true;

View File

@ -1093,7 +1093,7 @@ runtime_mstart(void* mp)
runtime_newextram(); runtime_newextram();
runtime_needextram = 0; runtime_needextram = 0;
} }
runtime_initsig(); runtime_initsig(false);
} }
if(m->mstartfn) if(m->mstartfn)

View File

@ -550,7 +550,7 @@ void* runtime_mal(uintptr);
String runtime_gostring(const byte*); String runtime_gostring(const byte*);
String runtime_gostringnocopy(const byte*); String runtime_gostringnocopy(const byte*);
void runtime_schedinit(void); void runtime_schedinit(void);
void runtime_initsig(void); void runtime_initsig(bool);
void runtime_sigenable(uint32 sig); void runtime_sigenable(uint32 sig);
void runtime_sigdisable(uint32 sig); void runtime_sigdisable(uint32 sig);
void runtime_sigignore(uint32 sig); void runtime_sigignore(uint32 sig);

View File

@ -13,11 +13,16 @@
extern SigTab runtime_sigtab[]; extern SigTab runtime_sigtab[];
void void
runtime_initsig(void) runtime_initsig(bool preinit)
{ {
int32 i; int32 i;
SigTab *t; 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. // First call: basic setup.
for(i = 0; runtime_sigtab[i].sig != -1; i++) { for(i = 0; runtime_sigtab[i].sig != -1; i++) {
t = &runtime_sigtab[i]; t = &runtime_sigtab[i];
@ -37,6 +42,9 @@ runtime_initsig(void)
} }
} }
if(runtime_isarchive && (t->flags&SigPanic) == 0)
continue;
t->flags |= SigHandling; t->flags |= SigHandling;
runtime_setsig(i, runtime_sighandler, true); runtime_setsig(i, runtime_sighandler, true);
} }