mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
37064e3daf
commit
54c9c975f1
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue