mirror of https://github.com/golang/go.git
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
This commit is contained in:
parent
f8f2727ab5
commit
c7f7bbbf03
|
|
@ -290,7 +290,6 @@ struct M
|
|||
GCStats gcstats;
|
||||
bool racecall;
|
||||
void* racepc;
|
||||
void* sigset;
|
||||
uint32 moreframesize_minalloc;
|
||||
|
||||
uintptr settype_buf[1024];
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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*)¶m, 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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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*)¶m, 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
|
||||
|
|
|
|||
Loading…
Reference in New Issue