aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2013-02-15 12:18:33 -0500
committerRuss Cox <rsc@golang.org>2013-02-15 12:18:33 -0500
commitc7f7bbbf03415e1805e503846627f2e08423c360 (patch)
tree8ef2e49d555a6febdccda01d89df9123b929e742 /src/pkg/runtime
parentf8f2727ab50decb8db6d2235e77e8079b8d22eba (diff)
downloadgo-c7f7bbbf03415e1805e503846627f2e08423c360.tar.xz
runtime: fix build on linux
In addition to the compile failure fixed in signal*.c, preserving the signal mask led to very strange crashes. Testing shows that looking for SIG_IGN is all that matters to get along with nohup, so reintroduce sigset_zero instead of trying to preserve the signal mask. TBR=iant CC=golang-dev https://golang.org/cl/7323067
Diffstat (limited to 'src/pkg/runtime')
-rw-r--r--src/pkg/runtime/runtime.h1
-rw-r--r--src/pkg/runtime/signal_linux_386.c2
-rw-r--r--src/pkg/runtime/signal_linux_amd64.c3
-rw-r--r--src/pkg/runtime/signal_linux_arm.c2
-rw-r--r--src/pkg/runtime/thread_darwin.c6
-rw-r--r--src/pkg/runtime/thread_freebsd.c6
-rw-r--r--src/pkg/runtime/thread_linux.c6
-rw-r--r--src/pkg/runtime/thread_netbsd.c7
-rw-r--r--src/pkg/runtime/thread_openbsd.c6
9 files changed, 14 insertions, 25 deletions
diff --git a/src/pkg/runtime/runtime.h b/src/pkg/runtime/runtime.h
index 6709e4f261..77f60cb4b5 100644
--- a/src/pkg/runtime/runtime.h
+++ b/src/pkg/runtime/runtime.h
@@ -290,7 +290,6 @@ struct M
GCStats gcstats;
bool racecall;
void* racepc;
- void* sigset;
uint32 moreframesize_minalloc;
uintptr settype_buf[1024];
diff --git a/src/pkg/runtime/signal_linux_386.c b/src/pkg/runtime/signal_linux_386.c
index cc4c8db5ca..8b9c5e43a5 100644
--- a/src/pkg/runtime/signal_linux_386.c
+++ b/src/pkg/runtime/signal_linux_386.c
@@ -128,7 +128,7 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
// under nohup and do not set explicit handler.
if(i == SIGHUP) {
runtime·memclr((byte*)&sa, sizeof sa);
- runtime·sigaction(i, nil, &sa);
+ runtime·rt_sigaction(i, nil, &sa, sizeof(sa.sa_mask));
if(sa.k_sa_handler == SIG_IGN)
return;
}
diff --git a/src/pkg/runtime/signal_linux_amd64.c b/src/pkg/runtime/signal_linux_amd64.c
index 6ca51f8c44..30b12fa1be 100644
--- a/src/pkg/runtime/signal_linux_amd64.c
+++ b/src/pkg/runtime/signal_linux_amd64.c
@@ -138,7 +138,8 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
// under nohup and do not set explicit handler.
if(i == SIGHUP) {
runtime·memclr((byte*)&sa, sizeof sa);
- runtime·sigaction(i, nil, &sa);
+ if(runtime·rt_sigaction(i, nil, &sa, sizeof(sa.sa_mask)) != 0)
+ runtime·throw("rt_sigaction read failure");
if(sa.sa_handler == SIG_IGN)
return;
}
diff --git a/src/pkg/runtime/signal_linux_arm.c b/src/pkg/runtime/signal_linux_arm.c
index 53ab07d36f..e2b1500934 100644
--- a/src/pkg/runtime/signal_linux_arm.c
+++ b/src/pkg/runtime/signal_linux_arm.c
@@ -144,7 +144,7 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
// under nohup and do not set explicit handler.
if(i == SIGHUP) {
runtime·memclr((byte*)&sa, sizeof sa);
- runtime·sigaction(i, nil, &sa);
+ runtime·rt_sigaction(i, nil, &sa, sizeof(sa.sa_mask));
if(sa.sa_handler == SIG_IGN)
return;
}
diff --git a/src/pkg/runtime/thread_darwin.c b/src/pkg/runtime/thread_darwin.c
index d55ec8dc3e..df1adf63e9 100644
--- a/src/pkg/runtime/thread_darwin.c
+++ b/src/pkg/runtime/thread_darwin.c
@@ -9,6 +9,7 @@
extern SigTab runtime·sigtab[];
+static Sigset sigset_none;
static Sigset sigset_all = ~(Sigset)0;
static Sigset sigset_prof = 1<<(SIGPROF-1);
@@ -98,8 +99,6 @@ runtime·newosproc(M *mp, G *gp, void *stk, void (*fn)(void))
}
runtime·sigprocmask(SIG_SETMASK, &sigset_all, &oset);
- mp->sigset = runtime·mal(sizeof(Sigset));
- *(Sigset*)mp->sigset = oset;
errno = runtime·bsdthread_create(stk, mp, gp, fn);
runtime·sigprocmask(SIG_SETMASK, &oset, nil);
@@ -117,8 +116,7 @@ runtime·minit(void)
m->gsignal = runtime·malg(32*1024); // OS X wants >=8K, Linux >=2K
runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
- if(m->sigset != nil)
- runtime·sigprocmask(SIG_SETMASK, m->sigset, nil);
+ runtime·sigprocmask(SIG_SETMASK, &sigset_none, nil);
runtime·setprof(m->profilehz > 0);
}
diff --git a/src/pkg/runtime/thread_freebsd.c b/src/pkg/runtime/thread_freebsd.c
index 0521576050..861e6b0f70 100644
--- a/src/pkg/runtime/thread_freebsd.c
+++ b/src/pkg/runtime/thread_freebsd.c
@@ -13,6 +13,7 @@ extern int32 runtime·sys_umtx_op(uint32*, int32, uint32, void*, void*);
#define CTL_HW 6
#define HW_NCPU 3
+static Sigset sigset_none;
static Sigset sigset_all = { ~(uint32)0, ~(uint32)0, ~(uint32)0, ~(uint32)0, };
static int32
@@ -90,8 +91,6 @@ runtime·newosproc(M *mp, G *gp, void *stk, void (*fn)(void))
}
runtime·sigprocmask(&sigset_all, &oset);
- mp->sigset = runtime·mal(sizeof(Sigset));
- *(Sigset*)mp->sigset = oset;
runtime·memclr((byte*)&param, sizeof param);
param.start_func = runtime·thr_start;
@@ -128,8 +127,7 @@ runtime·minit(void)
// Initialize signal handling
m->gsignal = runtime·malg(32*1024);
runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
- if(m->sigset != nil)
- runtime·sigprocmask(m->sigset, nil);
+ runtime·sigprocmask(&sigset_none, nil);
}
void
diff --git a/src/pkg/runtime/thread_linux.c b/src/pkg/runtime/thread_linux.c
index 604b98e57f..1a7eb7240c 100644
--- a/src/pkg/runtime/thread_linux.c
+++ b/src/pkg/runtime/thread_linux.c
@@ -13,6 +13,7 @@ int32 runtime·open(uint8*, int32, int32);
int32 runtime·close(int32);
int32 runtime·read(int32, void*, int32);
+static Sigset sigset_none;
static Sigset sigset_all = { ~(uint32)0, ~(uint32)0 };
// Linux futex.
@@ -148,8 +149,6 @@ runtime·newosproc(M *mp, G *gp, void *stk, void (*fn)(void))
// Disable signals during clone, so that the new thread starts
// with signals disabled. It will enable them in minit.
runtime·rtsigprocmask(SIG_SETMASK, &sigset_all, &oset, sizeof oset);
- mp->sigset = runtime·mal(sizeof(Sigset));
- *(Sigset*)mp->sigset = oset;
ret = runtime·clone(flags, stk, mp, gp, fn);
runtime·rtsigprocmask(SIG_SETMASK, &oset, nil, sizeof oset);
@@ -178,8 +177,7 @@ runtime·minit(void)
// Initialize signal handling.
m->gsignal = runtime·malg(32*1024); // OS X wants >=8K, Linux >=2K
runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
- if(m->sigset != nil)
- runtime·rtsigprocmask(SIG_SETMASK, m->sigset, nil, sizeof *m->sigset);
+ runtime·rtsigprocmask(SIG_SETMASK, &sigset_none, nil, sizeof(Sigset));
}
void
diff --git a/src/pkg/runtime/thread_netbsd.c b/src/pkg/runtime/thread_netbsd.c
index c689b55dfe..21fbc588a9 100644
--- a/src/pkg/runtime/thread_netbsd.c
+++ b/src/pkg/runtime/thread_netbsd.c
@@ -20,6 +20,7 @@ enum
extern SigTab runtime·sigtab[];
+static Sigset sigset_none;
static Sigset sigset_all = { ~(uint32)0, ~(uint32)0, ~(uint32)0, ~(uint32)0, };
extern void runtime·getcontext(UcontextT *context);
@@ -163,9 +164,6 @@ runtime·newosproc(M *mp, G *gp, void *stk, void (*fn)(void))
uc.uc_link = nil;
uc.uc_sigmask = sigset_all;
- mp->sigset = runtime·mal(sizeof(Sigset));
- runtime·sigprocmask(SIG_SETMASK, nil, mp->sigset);
-
runtime·lwp_mcontext_init(&uc.uc_mcontext, stk, mp, gp, fn);
ret = runtime·lwp_create(&uc, 0, &mp->procid);
@@ -197,8 +195,7 @@ runtime·minit(void)
// Initialize signal handling
m->gsignal = runtime·malg(32*1024);
runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
- if(m->sigset != nil)
- runtime·sigprocmask(SIG_SETMASK, m->sigset, nil);
+ runtime·sigprocmask(SIG_SETMASK, &sigset_none, nil);
}
void
diff --git a/src/pkg/runtime/thread_openbsd.c b/src/pkg/runtime/thread_openbsd.c
index 4d30193c00..99c4db972c 100644
--- a/src/pkg/runtime/thread_openbsd.c
+++ b/src/pkg/runtime/thread_openbsd.c
@@ -20,6 +20,7 @@ enum
extern SigTab runtime·sigtab[];
+static Sigset sigset_none;
static Sigset sigset_all = ~(Sigset)0;
extern int64 runtime·tfork(void *param, uintptr psize, M *mp, G *gp, void (*fn)(void));
@@ -141,8 +142,6 @@ runtime·newosproc(M *mp, G *gp, void *stk, void (*fn)(void))
param.tf_stack = stk;
oset = runtime·sigprocmask(SIG_SETMASK, sigset_all);
- mp->sigset = runtime·mal(sizeof(Sigset));
- *(Sigset*)mp->sigset = oset;
ret = runtime·tfork((byte*)&param, sizeof(param), mp, gp, fn);
runtime·sigprocmask(SIG_SETMASK, oset);
@@ -173,8 +172,7 @@ runtime·minit(void)
// Initialize signal handling
m->gsignal = runtime·malg(32*1024);
runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
- if(m->sigset != nil)
- runtime·sigprocmask(SIG_SETMASK, m->sigset, nil, sizeof *m->sigset);
+ runtime·sigprocmask(SIG_SETMASK, &sigset_none, nil, sizeof sigset_none);
}
void