mirror of
https://github.com/golang/go
synced 2024-11-25 06:17:58 -07:00
runtime: Permit default behaviour of SIGTSTP, SIGTTIN, SIGTTOU.
Fixes #3037. R=rsc, minux.ma, r, rsc CC=golang-dev https://golang.org/cl/5674072
This commit is contained in:
parent
efb28b2ac1
commit
3d8ebefbbe
@ -268,9 +268,10 @@ struct SigTab
|
|||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
SigNotify = 1<<0, // let signal.Notify have signal, even if from kernel
|
SigNotify = 1<<0, // let signal.Notify have signal, even if from kernel
|
||||||
SigKill = 1<<1, // if signal.Notify doesn't take it, exit quietly
|
SigKill = 1<<1, // if signal.Notify doesn't take it, exit quietly
|
||||||
SigThrow = 1<<2, // if signal.Notify doesn't take it, exit loudly
|
SigThrow = 1<<2, // if signal.Notify doesn't take it, exit loudly
|
||||||
SigPanic = 1<<3, // if the signal is from the kernel, panic
|
SigPanic = 1<<3, // if the signal is from the kernel, panic
|
||||||
|
SigDefault = 1<<4, // if the signal isn't explicitly requested, don't monitor it
|
||||||
};
|
};
|
||||||
|
|
||||||
// NOTE(rsc): keep in sync with extern.go:/type.Func.
|
// NOTE(rsc): keep in sync with extern.go:/type.Func.
|
||||||
@ -501,6 +502,7 @@ Slice runtime·gobytes(byte*, int32);
|
|||||||
String runtime·gostringnocopy(byte*);
|
String runtime·gostringnocopy(byte*);
|
||||||
String runtime·gostringw(uint16*);
|
String runtime·gostringw(uint16*);
|
||||||
void runtime·initsig(void);
|
void runtime·initsig(void);
|
||||||
|
void runtime·sigenable(uint32 sig);
|
||||||
int32 runtime·gotraceback(void);
|
int32 runtime·gotraceback(void);
|
||||||
void runtime·goroutineheader(G*);
|
void runtime·goroutineheader(G*);
|
||||||
void runtime·traceback(uint8 *pc, uint8 *sp, uint8 *lr, G* gp);
|
void runtime·traceback(uint8 *pc, uint8 *sp, uint8 *lr, G* gp);
|
||||||
|
@ -10,6 +10,11 @@ runtime·signame(int32)
|
|||||||
return runtime·emptystring;
|
return runtime·emptystring;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
runtime·sigenable(uint32 sig)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
runtime·resetcpuprofiler(int32 hz)
|
runtime·resetcpuprofiler(int32 hz)
|
||||||
{
|
{
|
||||||
|
@ -27,9 +27,27 @@ runtime·initsig(void)
|
|||||||
// First call: basic setup.
|
// First call: basic setup.
|
||||||
for(i = 0; i<NSIG; i++) {
|
for(i = 0; i<NSIG; i++) {
|
||||||
t = &runtime·sigtab[i];
|
t = &runtime·sigtab[i];
|
||||||
if(t->flags == 0)
|
if((t->flags == 0) || (t->flags & SigDefault))
|
||||||
continue;
|
continue;
|
||||||
runtime·setsig(i, runtime·sighandler, 1);
|
runtime·setsig(i, runtime·sighandler, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
runtime·sigenable(uint32 sig)
|
||||||
|
{
|
||||||
|
int32 i;
|
||||||
|
SigTab *t;
|
||||||
|
|
||||||
|
for(i = 0; i<NSIG; i++) {
|
||||||
|
// ~0 means all signals.
|
||||||
|
if(~sig == 0 || i == sig) {
|
||||||
|
t = &runtime·sigtab[i];
|
||||||
|
if(t->flags & SigDefault) {
|
||||||
|
runtime·setsig(i, runtime·sighandler, true);
|
||||||
|
t->flags &= ~SigDefault; // make this idempotent
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,6 +80,11 @@ runtime·sighandler(ExceptionRecord *info, Context *r, G *gp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
runtime·sigenable(uint32 sig)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
runtime·dosigprof(Context *r, G *gp)
|
runtime·dosigprof(Context *r, G *gp)
|
||||||
{
|
{
|
||||||
|
@ -87,6 +87,11 @@ runtime·sighandler(ExceptionRecord *info, Context *r, G *gp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
runtime·sigenable(uint32 sig)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
runtime·dosigprof(Context *r, G *gp)
|
runtime·dosigprof(Context *r, G *gp)
|
||||||
{
|
{
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#define K SigKill
|
#define K SigKill
|
||||||
#define T SigThrow
|
#define T SigThrow
|
||||||
#define P SigPanic
|
#define P SigPanic
|
||||||
|
#define D SigDefault
|
||||||
|
|
||||||
SigTab runtime·sigtab[] = {
|
SigTab runtime·sigtab[] = {
|
||||||
/* 0 */ 0, "SIGNONE: no trap",
|
/* 0 */ 0, "SIGNONE: no trap",
|
||||||
@ -26,11 +27,11 @@ SigTab runtime·sigtab[] = {
|
|||||||
/* 15 */ N+K, "SIGTERM: termination",
|
/* 15 */ N+K, "SIGTERM: termination",
|
||||||
/* 16 */ N, "SIGURG: urgent condition on socket",
|
/* 16 */ N, "SIGURG: urgent condition on socket",
|
||||||
/* 17 */ 0, "SIGSTOP: stop",
|
/* 17 */ 0, "SIGSTOP: stop",
|
||||||
/* 18 */ N, "SIGTSTP: keyboard stop",
|
/* 18 */ N+D, "SIGTSTP: keyboard stop",
|
||||||
/* 19 */ 0, "SIGCONT: continue after stop",
|
/* 19 */ 0, "SIGCONT: continue after stop",
|
||||||
/* 20 */ N, "SIGCHLD: child status has changed",
|
/* 20 */ N, "SIGCHLD: child status has changed",
|
||||||
/* 21 */ N, "SIGTTIN: background read from tty",
|
/* 21 */ N+D, "SIGTTIN: background read from tty",
|
||||||
/* 22 */ N, "SIGTTOU: background write to tty",
|
/* 22 */ N+D, "SIGTTOU: background write to tty",
|
||||||
/* 23 */ N, "SIGIO: i/o now possible",
|
/* 23 */ N, "SIGIO: i/o now possible",
|
||||||
/* 24 */ N, "SIGXCPU: cpu limit exceeded",
|
/* 24 */ N, "SIGXCPU: cpu limit exceeded",
|
||||||
/* 25 */ N, "SIGXFSZ: file size limit exceeded",
|
/* 25 */ N, "SIGXFSZ: file size limit exceeded",
|
||||||
@ -46,3 +47,4 @@ SigTab runtime·sigtab[] = {
|
|||||||
#undef K
|
#undef K
|
||||||
#undef T
|
#undef T
|
||||||
#undef P
|
#undef P
|
||||||
|
#undef D
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#define K SigKill
|
#define K SigKill
|
||||||
#define T SigThrow
|
#define T SigThrow
|
||||||
#define P SigPanic
|
#define P SigPanic
|
||||||
|
#define D SigDefault
|
||||||
|
|
||||||
SigTab runtime·sigtab[] = {
|
SigTab runtime·sigtab[] = {
|
||||||
/* 0 */ 0, "SIGNONE: no trap",
|
/* 0 */ 0, "SIGNONE: no trap",
|
||||||
@ -26,11 +27,11 @@ SigTab runtime·sigtab[] = {
|
|||||||
/* 15 */ N+K, "SIGTERM: termination",
|
/* 15 */ N+K, "SIGTERM: termination",
|
||||||
/* 16 */ N, "SIGURG: urgent condition on socket",
|
/* 16 */ N, "SIGURG: urgent condition on socket",
|
||||||
/* 17 */ 0, "SIGSTOP: stop",
|
/* 17 */ 0, "SIGSTOP: stop",
|
||||||
/* 18 */ N, "SIGTSTP: keyboard stop",
|
/* 18 */ N+D, "SIGTSTP: keyboard stop",
|
||||||
/* 19 */ 0, "SIGCONT: continue after stop",
|
/* 19 */ 0, "SIGCONT: continue after stop",
|
||||||
/* 20 */ N, "SIGCHLD: child status has changed",
|
/* 20 */ N, "SIGCHLD: child status has changed",
|
||||||
/* 21 */ N, "SIGTTIN: background read from tty",
|
/* 21 */ N+D, "SIGTTIN: background read from tty",
|
||||||
/* 22 */ N, "SIGTTOU: background write to tty",
|
/* 22 */ N+D, "SIGTTOU: background write to tty",
|
||||||
/* 23 */ N, "SIGIO: i/o now possible",
|
/* 23 */ N, "SIGIO: i/o now possible",
|
||||||
/* 24 */ N, "SIGXCPU: cpu limit exceeded",
|
/* 24 */ N, "SIGXCPU: cpu limit exceeded",
|
||||||
/* 25 */ N, "SIGXFSZ: file size limit exceeded",
|
/* 25 */ N, "SIGXFSZ: file size limit exceeded",
|
||||||
@ -47,3 +48,4 @@ SigTab runtime·sigtab[] = {
|
|||||||
#undef K
|
#undef K
|
||||||
#undef T
|
#undef T
|
||||||
#undef P
|
#undef P
|
||||||
|
#undef D
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#define K SigKill
|
#define K SigKill
|
||||||
#define T SigThrow
|
#define T SigThrow
|
||||||
#define P SigPanic
|
#define P SigPanic
|
||||||
|
#define D SigDefault
|
||||||
|
|
||||||
SigTab runtime·sigtab[] = {
|
SigTab runtime·sigtab[] = {
|
||||||
/* 0 */ 0, "SIGNONE: no trap",
|
/* 0 */ 0, "SIGNONE: no trap",
|
||||||
@ -28,9 +29,9 @@ SigTab runtime·sigtab[] = {
|
|||||||
/* 17 */ N, "SIGCHLD: child status has changed",
|
/* 17 */ N, "SIGCHLD: child status has changed",
|
||||||
/* 18 */ 0, "SIGCONT: continue",
|
/* 18 */ 0, "SIGCONT: continue",
|
||||||
/* 19 */ 0, "SIGSTOP: stop, unblockable",
|
/* 19 */ 0, "SIGSTOP: stop, unblockable",
|
||||||
/* 20 */ N, "SIGTSTP: keyboard stop",
|
/* 20 */ N+D, "SIGTSTP: keyboard stop",
|
||||||
/* 21 */ N, "SIGTTIN: background read from tty",
|
/* 21 */ N+D, "SIGTTIN: background read from tty",
|
||||||
/* 22 */ N, "SIGTTOU: background write to tty",
|
/* 22 */ N+D, "SIGTTOU: background write to tty",
|
||||||
/* 23 */ N, "SIGURG: urgent condition on socket",
|
/* 23 */ N, "SIGURG: urgent condition on socket",
|
||||||
/* 24 */ N, "SIGXCPU: cpu limit exceeded",
|
/* 24 */ N, "SIGXCPU: cpu limit exceeded",
|
||||||
/* 25 */ N, "SIGXFSZ: file size limit exceeded",
|
/* 25 */ N, "SIGXFSZ: file size limit exceeded",
|
||||||
@ -79,3 +80,4 @@ SigTab runtime·sigtab[] = {
|
|||||||
#undef K
|
#undef K
|
||||||
#undef T
|
#undef T
|
||||||
#undef P
|
#undef P
|
||||||
|
#undef D
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#define K SigKill
|
#define K SigKill
|
||||||
#define T SigThrow
|
#define T SigThrow
|
||||||
#define P SigPanic
|
#define P SigPanic
|
||||||
|
#define D SigDefault
|
||||||
|
|
||||||
SigTab runtime·sigtab[] = {
|
SigTab runtime·sigtab[] = {
|
||||||
/* 0 */ 0, "SIGNONE: no trap",
|
/* 0 */ 0, "SIGNONE: no trap",
|
||||||
@ -26,11 +27,11 @@ SigTab runtime·sigtab[] = {
|
|||||||
/* 15 */ N+K, "SIGTERM: termination",
|
/* 15 */ N+K, "SIGTERM: termination",
|
||||||
/* 16 */ N, "SIGURG: urgent condition on socket",
|
/* 16 */ N, "SIGURG: urgent condition on socket",
|
||||||
/* 17 */ 0, "SIGSTOP: stop",
|
/* 17 */ 0, "SIGSTOP: stop",
|
||||||
/* 18 */ N, "SIGTSTP: keyboard stop",
|
/* 18 */ N+D, "SIGTSTP: keyboard stop",
|
||||||
/* 19 */ 0, "SIGCONT: continue after stop",
|
/* 19 */ 0, "SIGCONT: continue after stop",
|
||||||
/* 20 */ N, "SIGCHLD: child status has changed",
|
/* 20 */ N, "SIGCHLD: child status has changed",
|
||||||
/* 21 */ N, "SIGTTIN: background read from tty",
|
/* 21 */ N+D, "SIGTTIN: background read from tty",
|
||||||
/* 22 */ N, "SIGTTOU: background write to tty",
|
/* 22 */ N+D, "SIGTTOU: background write to tty",
|
||||||
/* 23 */ N, "SIGIO: i/o now possible",
|
/* 23 */ N, "SIGIO: i/o now possible",
|
||||||
/* 24 */ N, "SIGXCPU: cpu limit exceeded",
|
/* 24 */ N, "SIGXCPU: cpu limit exceeded",
|
||||||
/* 25 */ N, "SIGXFSZ: file size limit exceeded",
|
/* 25 */ N, "SIGXFSZ: file size limit exceeded",
|
||||||
@ -47,3 +48,4 @@ SigTab runtime·sigtab[] = {
|
|||||||
#undef K
|
#undef K
|
||||||
#undef T
|
#undef T
|
||||||
#undef P
|
#undef P
|
||||||
|
#undef D
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#define K SigKill
|
#define K SigKill
|
||||||
#define T SigThrow
|
#define T SigThrow
|
||||||
#define P SigPanic
|
#define P SigPanic
|
||||||
|
#define D SigDefault
|
||||||
|
|
||||||
SigTab runtime·sigtab[] = {
|
SigTab runtime·sigtab[] = {
|
||||||
/* 0 */ 0, "SIGNONE: no trap",
|
/* 0 */ 0, "SIGNONE: no trap",
|
||||||
@ -26,11 +27,11 @@ SigTab runtime·sigtab[] = {
|
|||||||
/* 15 */ N+K, "SIGTERM: termination",
|
/* 15 */ N+K, "SIGTERM: termination",
|
||||||
/* 16 */ N, "SIGURG: urgent condition on socket",
|
/* 16 */ N, "SIGURG: urgent condition on socket",
|
||||||
/* 17 */ 0, "SIGSTOP: stop",
|
/* 17 */ 0, "SIGSTOP: stop",
|
||||||
/* 18 */ N, "SIGTSTP: keyboard stop",
|
/* 18 */ N+D, "SIGTSTP: keyboard stop",
|
||||||
/* 19 */ 0, "SIGCONT: continue after stop",
|
/* 19 */ 0, "SIGCONT: continue after stop",
|
||||||
/* 20 */ N, "SIGCHLD: child status has changed",
|
/* 20 */ N, "SIGCHLD: child status has changed",
|
||||||
/* 21 */ N, "SIGTTIN: background read from tty",
|
/* 21 */ N+D, "SIGTTIN: background read from tty",
|
||||||
/* 22 */ N, "SIGTTOU: background write to tty",
|
/* 22 */ N+D, "SIGTTOU: background write to tty",
|
||||||
/* 23 */ N, "SIGIO: i/o now possible",
|
/* 23 */ N, "SIGIO: i/o now possible",
|
||||||
/* 24 */ N, "SIGXCPU: cpu limit exceeded",
|
/* 24 */ N, "SIGXCPU: cpu limit exceeded",
|
||||||
/* 25 */ N, "SIGXFSZ: file size limit exceeded",
|
/* 25 */ N, "SIGXFSZ: file size limit exceeded",
|
||||||
@ -47,3 +48,4 @@ SigTab runtime·sigtab[] = {
|
|||||||
#undef K
|
#undef K
|
||||||
#undef T
|
#undef T
|
||||||
#undef P
|
#undef P
|
||||||
|
#undef D
|
||||||
|
@ -140,10 +140,12 @@ func signal_enable(s uint32) {
|
|||||||
// Special case: want everything.
|
// Special case: want everything.
|
||||||
for(i=0; i<nelem(sig.wanted); i++)
|
for(i=0; i<nelem(sig.wanted); i++)
|
||||||
sig.wanted[i] = ~(uint32)0;
|
sig.wanted[i] = ~(uint32)0;
|
||||||
|
runtime·sigenable(s);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(s >= nelem(sig.wanted)*32)
|
if(s >= nelem(sig.wanted)*32)
|
||||||
return;
|
return;
|
||||||
sig.wanted[s/32] |= 1U<<(s&31);
|
sig.wanted[s/32] |= 1U<<(s&31);
|
||||||
|
runtime·sigenable(s);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user