From: Russ Cox Date: Fri, 15 Feb 2013 17:18:33 +0000 (-0500) Subject: runtime: fix build on linux X-Git-Tag: go1.1rc2~1005 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c7f7bbbf03415e1805e503846627f2e08423c360;p=gostls13.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 --- 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*)¶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 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*)¶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