aboutsummaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2016-02-12 22:10:09 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2016-02-12 22:10:09 +0000
commitb841fbd417873fda16fbf42d5c6a52cccef384dc (patch)
tree0f1bf2665d8697cd161c1f9d5271e3db262ac73e /libgo
parentd6ad38a3785ff70a6c08d1693fe8376f8e788810 (diff)
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
Diffstat (limited to 'libgo')
-rw-r--r--libgo/runtime/go-libmain.c6
-rw-r--r--libgo/runtime/proc.c2
-rw-r--r--libgo/runtime/runtime.h2
-rw-r--r--libgo/runtime/signal_unix.c10
4 files changed, 15 insertions, 5 deletions
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);
}