diff options
Diffstat (limited to 'src/pkg/runtime/signal_linux_arm.c')
-rw-r--r-- | src/pkg/runtime/signal_linux_arm.c | 77 |
1 files changed, 14 insertions, 63 deletions
diff --git a/src/pkg/runtime/signal_linux_arm.c b/src/pkg/runtime/signal_linux_arm.c index b32ec7a22..176a4ce56 100644 --- a/src/pkg/runtime/signal_linux_arm.c +++ b/src/pkg/runtime/signal_linux_arm.c @@ -38,22 +38,14 @@ runtime·dumpregs(Sigcontext *r) * and calls sighandler(). */ extern void runtime·sigtramp(void); -extern void runtime·sigignore(void); // just returns extern void runtime·sigreturn(void); // calls runtime·sigreturn -String -runtime·signame(int32 sig) -{ - if(sig < 0 || sig >= NSIG) - return runtime·emptystring; - return runtime·gostringnocopy((byte*)runtime·sigtab[sig].name); -} - void runtime·sighandler(int32 sig, Siginfo *info, void *context, G *gp) { Ucontext *uc; Sigcontext *r; + SigTab *t; uc = context; r = &uc->uc_mcontext; @@ -63,7 +55,10 @@ runtime·sighandler(int32 sig, Siginfo *info, void *context, G *gp) return; } - if(gp != nil && (runtime·sigtab[sig].flags & SigPanic)) { + t = &runtime·sigtab[sig]; + if(info->si_code != SI_USER && (t->flags & SigPanic)) { + if(gp == nil) + goto Throw; // Make it look like a call to the signal func. // Have to pass arguments out of band since // augmenting the stack frame would break @@ -84,12 +79,15 @@ runtime·sighandler(int32 sig, Siginfo *info, void *context, G *gp) return; } - if(runtime·sigtab[sig].flags & SigQueue) { - if(runtime·sigsend(sig) || (runtime·sigtab[sig].flags & SigIgnore)) + if(info->si_code == SI_USER || (t->flags & SigNotify)) + if(runtime·sigsend(sig)) return; - runtime·exit(2); // SIGINT, SIGTERM, etc - } + if(t->flags & SigKill) + runtime·exit(2); + if(!(t->flags & SigThrow)) + return; +Throw: if(runtime·panicking) // traceback already printed runtime·exit(2); runtime·panicking = 1; @@ -124,8 +122,8 @@ runtime·signalstack(byte *p, int32 n) runtime·sigaltstack(&st, nil); } -static void -sigaction(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart) +void +runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart) { Sigaction sa; @@ -140,50 +138,3 @@ sigaction(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart) sa.sa_handler = fn; runtime·rt_sigaction(i, &sa, nil, 8); } - -void -runtime·initsig(int32 queue) -{ - int32 i; - void *fn; - - runtime·siginit(); - - for(i = 0; i<NSIG; i++) { - if(runtime·sigtab[i].flags) { - if((runtime·sigtab[i].flags & SigQueue) != queue) - continue; - if(runtime·sigtab[i].flags & (SigCatch | SigQueue)) - fn = runtime·sighandler; - else - fn = runtime·sigignore; - sigaction(i, fn, (runtime·sigtab[i].flags & SigRestart) != 0); - } - } -} - -void -runtime·resetcpuprofiler(int32 hz) -{ - Itimerval it; - - runtime·memclr((byte*)&it, sizeof it); - if(hz == 0) { - runtime·setitimer(ITIMER_PROF, &it, nil); - sigaction(SIGPROF, SIG_IGN, true); - } else { - sigaction(SIGPROF, runtime·sighandler, true); - it.it_interval.tv_sec = 0; - it.it_interval.tv_usec = 1000000 / hz; - it.it_value = it.it_interval; - runtime·setitimer(ITIMER_PROF, &it, nil); - } - m->profilehz = hz; -} - -void -os·sigpipe(void) -{ - sigaction(SIGPIPE, SIG_DFL, false); - runtime·raisesigpipe(); -} |