aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/linux
diff options
context:
space:
mode:
authorDavid Symonds <dsymonds@golang.org>2009-12-15 18:21:29 -0800
committerRuss Cox <rsc@golang.org>2009-12-15 18:21:29 -0800
commitb5866494eaabd03a8eaeaabd05bd2e043e2795b5 (patch)
tree84efb708e358a0c126fa11d918d75f2cc0e78a05 /src/pkg/runtime/linux
parenta47a45ec7741d677ea6582cdeee3419325ac9488 (diff)
downloadgo-b5866494eaabd03a8eaeaabd05bd2e043e2795b5.tar.xz
os/signal: new package
Fixes #71. R=rsc, r https://golang.org/cl/162056
Diffstat (limited to 'src/pkg/runtime/linux')
-rw-r--r--src/pkg/runtime/linux/386/signal.c18
-rw-r--r--src/pkg/runtime/linux/amd64/signal.c18
-rw-r--r--src/pkg/runtime/linux/arm/signal.c8
-rw-r--r--src/pkg/runtime/linux/signals.h40
4 files changed, 61 insertions, 23 deletions
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; i++) {
if(sigtab[i].flags) {
- if(sigtab[i].flags & SigCatch)
+ if(sigtab[i].flags & (SigCatch | SigQueue))
sa.k_sa_handler = (void*)sigtramp;
else
sa.k_sa_handler = (void*)sigignore;
@@ -99,4 +114,3 @@ initsig(void)
}
}
}
-
diff --git a/src/pkg/runtime/linux/amd64/signal.c b/src/pkg/runtime/linux/amd64/signal.c
index 55215176de..693b8c7042 100644
--- a/src/pkg/runtime/linux/amd64/signal.c
+++ b/src/pkg/runtime/linux/amd64/signal.c
@@ -41,6 +41,14 @@ 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)
{
@@ -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; i++) {
if(sigtab[i].flags) {
- if(sigtab[i].flags & SigCatch)
+ if(sigtab[i].flags & (SigCatch | SigQueue))
sa.sa_handler = (void*)sigtramp;
else
sa.sa_handler = (void*)sigignore;
@@ -109,4 +124,3 @@ initsig(void)
}
}
}
-
diff --git a/src/pkg/runtime/linux/arm/signal.c b/src/pkg/runtime/linux/arm/signal.c
index f14dcbf912..2400575481 100644
--- a/src/pkg/runtime/linux/arm/signal.c
+++ b/src/pkg/runtime/linux/arm/signal.c
@@ -35,6 +35,14 @@ 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(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