aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime/linux/amd64/signal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/linux/amd64/signal.c')
-rw-r--r--src/pkg/runtime/linux/amd64/signal.c18
1 files changed, 16 insertions, 2 deletions
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)
}
}
}
-