From b5866494eaabd03a8eaeaabd05bd2e043e2795b5 Mon Sep 17 00:00:00 2001 From: David Symonds Date: Tue, 15 Dec 2009 18:21:29 -0800 Subject: os/signal: new package Fixes #71. R=rsc, r https://golang.org/cl/162056 --- src/pkg/runtime/linux/386/signal.c | 18 ++++++++++++++-- src/pkg/runtime/linux/amd64/signal.c | 18 ++++++++++++++-- src/pkg/runtime/linux/arm/signal.c | 8 ++++++++ src/pkg/runtime/linux/signals.h | 40 +++++++++++++++++++----------------- 4 files changed, 61 insertions(+), 23 deletions(-) (limited to 'src/pkg/runtime/linux') diff --git a/src/pkg/runtime/linux/386/signal.c b/src/pkg/runtime/linux/386/signal.c index 90685d8799..2e6c7a5ff0 100644 --- a/src/pkg/runtime/linux/386/signal.c +++ b/src/pkg/runtime/linux/386/signal.c @@ -33,12 +33,25 @@ extern void sigtramp(void); extern void sigignore(void); // just returns extern void sigreturn(void); // calls sigreturn +String +signame(int32 sig) +{ + if(sig < 0 || sig >= NSIG) + return emptystring; + return gostring((byte*)sigtab[sig].name); +} + void sighandler(int32 sig, Siginfo* info, void* context) { Ucontext *uc; Sigcontext *sc; + if(sigtab[sig].flags & SigQueue) { + sigsend(sig); + return; + } + if(panicking) // traceback already printed exit(2); panicking = 1; @@ -81,13 +94,15 @@ initsig(void) { static Sigaction sa; + siginit(); + int32 i; sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESTORER; sa.sa_mask = 0xFFFFFFFFFFFFFFFFULL; sa.sa_restorer = (void*)sigreturn; for(i = 0; i= NSIG) + return emptystring; + return gostring((byte*)sigtab[sig].name); +} + void sighandler(int32 sig, Siginfo* info, void* context) { @@ -48,6 +56,11 @@ sighandler(int32 sig, Siginfo* info, void* context) Mcontext *mc; Sigcontext *sc; + if(sigtab[sig].flags & SigQueue) { + sigsend(sig); + return; + } + if(panicking) // traceback already printed exit(2); panicking = 1; @@ -91,13 +104,15 @@ initsig(void) { static Sigaction sa; + siginit(); + int32 i; sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESTORER; sa.sa_mask = 0xFFFFFFFFFFFFFFFFULL; sa.sa_restorer = (void*)sigreturn; for(i = 0; i= NSIG) + return emptystring; + return gostring((byte*)sigtab[sig].name); +} + void sighandler(void) {} // void // sighandler(int32 sig, Siginfo* info, void* context) diff --git a/src/pkg/runtime/linux/signals.h b/src/pkg/runtime/linux/signals.h index 8f1112b991..883ac4e04a 100644 --- a/src/pkg/runtime/linux/signals.h +++ b/src/pkg/runtime/linux/signals.h @@ -5,11 +5,12 @@ #define C SigCatch #define I SigIgnore #define R SigRestart +#define Q SigQueue static SigTab sigtab[] = { /* 0 */ 0, "SIGNONE: no trap", - /* 1 */ 0, "SIGHUP: terminal line hangup", - /* 2 */ 0, "SIGINT: interrupt", + /* 1 */ Q+R, "SIGHUP: terminal line hangup", + /* 2 */ Q+R, "SIGINT: interrupt", /* 3 */ C, "SIGQUIT: quit", /* 4 */ C, "SIGILL: illegal instruction", /* 5 */ C, "SIGTRAP: trace trap", @@ -17,31 +18,32 @@ static SigTab sigtab[] = { /* 7 */ C, "SIGBUS: bus error", /* 8 */ C, "SIGFPE: floating-point exception", /* 9 */ 0, "SIGKILL: kill", - /* 10 */ 0, "SIGUSR1: user-defined signal 1", + /* 10 */ Q+R, "SIGUSR1: user-defined signal 1", /* 11 */ C, "SIGSEGV: segmentation violation", - /* 12 */ 0, "SIGUSR2: user-defined signal 2", + /* 12 */ Q+R, "SIGUSR2: user-defined signal 2", /* 13 */ I, "SIGPIPE: write to broken pipe", - /* 14 */ 0, "SIGALRM: alarm clock", - /* 15 */ 0, "SIGTERM: termination", - /* 16 */ 0, "SIGSTKFLT: stack fault", - /* 17 */ I+R, "SIGCHLD: child status has changed", + /* 14 */ Q+R, "SIGALRM: alarm clock", + /* 15 */ Q+R, "SIGTERM: termination", + /* 16 */ Q+R, "SIGSTKFLT: stack fault", + /* 17 */ Q+R, "SIGCHLD: child status has changed", /* 18 */ 0, "SIGCONT: continue", /* 19 */ 0, "SIGSTOP: stop, unblockable", - /* 20 */ 0, "SIGTSTP: keyboard stop", - /* 21 */ 0, "SIGTTIN: background read from tty", - /* 22 */ 0, "SIGTTOU: background write to tty", - /* 23 */ 0, "SIGURG: urgent condition on socket", - /* 24 */ 0, "SIGXCPU: cpu limit exceeded", - /* 25 */ 0, "SIGXFSZ: file size limit exceeded", - /* 26 */ 0, "SIGVTALRM: virtual alarm clock", - /* 27 */ 0, "SIGPROF: profiling alarm clock", - /* 28 */ I+R, "SIGWINCH: window size change", - /* 29 */ 0, "SIGIO: i/o now possible", - /* 30 */ 0, "SIGPWR: power failure restart", + /* 20 */ Q+R, "SIGTSTP: keyboard stop", + /* 21 */ Q+R, "SIGTTIN: background read from tty", + /* 22 */ Q+R, "SIGTTOU: background write to tty", + /* 23 */ Q+R, "SIGURG: urgent condition on socket", + /* 24 */ Q+R, "SIGXCPU: cpu limit exceeded", + /* 25 */ Q+R, "SIGXFSZ: file size limit exceeded", + /* 26 */ Q+R, "SIGVTALRM: virtual alarm clock", + /* 27 */ Q+R, "SIGPROF: profiling alarm clock", + /* 28 */ Q+R, "SIGWINCH: window size change", + /* 29 */ Q+R, "SIGIO: i/o now possible", + /* 30 */ Q+R, "SIGPWR: power failure restart", /* 31 */ C, "SIGSYS: bad system call", }; #undef C #undef I #undef R +#undef Q #define NSIG 32 -- cgit v1.3-5-g9baa