Commit 54c9c975 by Ian Lance Taylor

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
parent 37064e3d
28a9dfbc3cda0bf7fd4f3fb1506c547f6cdf41a5
22278c6e8ce3982b09111183bc6addf0184bef1f
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
......@@ -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;
......
......@@ -1093,7 +1093,7 @@ runtime_mstart(void* mp)
runtime_newextram();
runtime_needextram = 0;
}
runtime_initsig();
runtime_initsig(false);
}
if(m->mstartfn)
......
......@@ -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);
......
......@@ -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);
}
......
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