]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix build on linux
authorRuss Cox <rsc@golang.org>
Fri, 15 Feb 2013 17:18:33 +0000 (12:18 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 15 Feb 2013 17:18:33 +0000 (12:18 -0500)
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

src/pkg/runtime/runtime.h
src/pkg/runtime/signal_linux_386.c
src/pkg/runtime/signal_linux_amd64.c
src/pkg/runtime/signal_linux_arm.c
src/pkg/runtime/thread_darwin.c
src/pkg/runtime/thread_freebsd.c
src/pkg/runtime/thread_linux.c
src/pkg/runtime/thread_netbsd.c
src/pkg/runtime/thread_openbsd.c

index 6709e4f261e741e26373a7b23225b2b9be341b11..77f60cb4b58f4bc95450938b2f7534cb52555e47 100644 (file)
@@ -290,7 +290,6 @@ struct      M
        GCStats gcstats;
        bool    racecall;
        void*   racepc;
-       void*   sigset;
        uint32  moreframesize_minalloc;
 
        uintptr settype_buf[1024];
index cc4c8db5ca993b2578aedaaef5610d98167bed2b..8b9c5e43a5706b52c92452e3a2453d7d93c48b7a 100644 (file)
@@ -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;
        }
index 6ca51f8c44c2526c3d3250256cc3880c4b8ff8ba..30b12fa1be97992755d7923fb9d02ca6be79ab0f 100644 (file)
@@ -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;
        }
index 53ab07d36f80e9a8fe69d88257442ec8cf420c54..e2b1500934c2575e998566eb2bc11d77a04060dc 100644 (file)
@@ -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;
        }
index d55ec8dc3ed8b3d85f134738c1c152c1489ed1f5..df1adf63e92a7cf9633733f63ea04d07fb83f89b 100644 (file)
@@ -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);
 }
 
index 0521576050257caeeef7ed57e5b2c9506e3f04d9..861e6b0f705420dbdad49f38f5247250bcb89ec8 100644 (file)
@@ -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
index 604b98e57fa362b5af8182d64af8feee11bf3dfc..1a7eb7240c185448a7d2ebb9a7e71246b156b019 100644 (file)
@@ -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
index c689b55dfefafeeedbfa3dfed93a5b0149d6008f..21fbc588a940e40a4e9cc54e799ee709cf245d20 100644 (file)
@@ -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
index 4d30193c000442f6f0d187bb6084bbed8eb8b2ff..99c4db972cbb2f63f6a8cff4df31d11718bfcfd6 100644 (file)
@@ -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