1 // Copyright 2012 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // +build darwin dragonfly freebsd linux netbsd openbsd solaris
11 #include "signal_unix.h"
13 extern SigTab runtime_sigtab
[];
16 runtime_initsig(bool preinit
)
21 // For c-archive/c-shared this is called by go-libmain.c with
23 if(runtime_isarchive
&& !preinit
)
26 // First call: basic setup.
27 for(i
= 0; runtime_sigtab
[i
].sig
!= -1; i
++) {
28 t
= &runtime_sigtab
[i
];
29 if((t
->flags
== 0) || (t
->flags
& SigDefault
))
32 t
->fwdsig
= runtime_getsig(i
);
34 // For some signals, we respect an inherited SIG_IGN handler
35 // rather than insist on installing our own default handler.
36 // Even these signals can be fetched using the os/signal package.
40 if(t
->fwdsig
== GO_SIG_IGN
) {
45 if(runtime_isarchive
&& (t
->flags
&SigPanic
) == 0)
48 t
->flags
|= SigHandling
;
49 runtime_setsig(i
, runtime_sighandler
, true);
54 runtime_sigenable(uint32 sig
)
60 for(i
= 0; runtime_sigtab
[i
].sig
!= -1; i
++) {
61 if(runtime_sigtab
[i
].sig
== (int32
)sig
) {
62 t
= &runtime_sigtab
[i
];
70 if((t
->flags
& SigNotify
) && !(t
->flags
& SigHandling
)) {
71 t
->flags
|= SigHandling
;
72 t
->fwdsig
= runtime_getsig(i
);
73 runtime_setsig(i
, runtime_sighandler
, true);
78 runtime_sigdisable(uint32 sig
)
84 for(i
= 0; runtime_sigtab
[i
].sig
!= -1; i
++) {
85 if(runtime_sigtab
[i
].sig
== (int32
)sig
) {
86 t
= &runtime_sigtab
[i
];
94 if((sig
== SIGHUP
|| sig
== SIGINT
) && t
->fwdsig
== GO_SIG_IGN
) {
95 t
->flags
&= ~SigHandling
;
96 runtime_setsig(i
, t
->fwdsig
, true);
101 runtime_sigignore(uint32 sig
)
107 for(i
= 0; runtime_sigtab
[i
].sig
!= -1; i
++) {
108 if(runtime_sigtab
[i
].sig
== (int32
)sig
) {
109 t
= &runtime_sigtab
[i
];
117 if((t
->flags
& SigNotify
) != 0) {
118 t
->flags
&= ~SigHandling
;
119 runtime_setsig(i
, GO_SIG_IGN
, true);
124 runtime_resetcpuprofiler(int32 hz
)
128 runtime_memclr((byte
*)&it
, sizeof it
);
130 runtime_setitimer(ITIMER_PROF
, &it
, nil
);
132 it
.it_interval
.tv_sec
= 0;
133 it
.it_interval
.tv_usec
= 1000000 / hz
;
134 it
.it_value
= it
.it_interval
;
135 runtime_setitimer(ITIMER_PROF
, &it
, nil
);
137 runtime_m()->profilehz
= hz
;
141 runtime_unblocksignals(void)
143 sigset_t sigset_none
;
144 sigemptyset(&sigset_none
);
145 pthread_sigmask(SIG_SETMASK
, &sigset_none
, nil
);
154 // OS X core dumps are linear dumps of the mapped memory,
155 // from the first virtual byte to the last, with zeros in the gaps.
156 // Because of the way we arrange the address space on 64-bit systems,
157 // this means the OS X core file will be >128 GB and even on a zippy
158 // workstation can take OS X well over an hour to write (uninterruptible).
159 // Save users from making that mistake.
160 if(sizeof(void*) == 8)
164 runtime_unblocksignals();
165 for(i
= 0; runtime_sigtab
[i
].sig
!= -1; i
++)
166 if(runtime_sigtab
[i
].sig
== SIGABRT
)
168 runtime_setsig(i
, GO_SIG_DFL
, false);
169 runtime_raise(SIGABRT
);
173 runtime_raise(int32 sig
)