111 pthread_mutex_lock(&lock);
112 if(atomic_compare_exchange_strong(&signal_nc, &expected, nc)){
114 sigaction(SIGWINCH, &old_winch,
NULL);
115 sigaction(SIGCONT, &old_cont,
NULL);
116 handling_winch =
false;
119 sigaction(SIGABRT, &old_abrt,
NULL);
120 sigaction(SIGBUS, &old_bus,
NULL);
121 sigaction(SIGFPE, &old_fpe,
NULL);
122 sigaction(SIGILL, &old_ill,
NULL);
123 sigaction(SIGINT, &old_int,
NULL);
124 sigaction(SIGQUIT, &old_quit,
NULL);
125 sigaction(SIGSEGV, &old_segv,
NULL);
126 sigaction(SIGTERM, &old_term,
NULL);
127 handling_fatals =
false;
129 if(alt_signal_stack.ss_sp){
130 alt_signal_stack.ss_flags = SS_DISABLE;
131 if(sigaltstack(&alt_signal_stack,
NULL)){
133 fprintf(stderr,
"couldn't remove alternate signal stack (%s)", strerror(errno));
137 *altstack = alt_signal_stack.ss_sp;
138 alt_signal_stack.ss_sp =
NULL;
139 ret = !atomic_compare_exchange_strong(&signal_nc, &expected,
NULL);
141 pthread_mutex_unlock(&lock);
143 fprintf(stderr,
"signals weren't registered for %p (had %p)", nc, expected);
196 int(*handler)(
void*,
void**,
int)){
198 void* expected =
NULL;
202 if(!atomic_compare_exchange_strong(&signal_nc, &expected, nc)){
203 fprintf(stderr,
"%p is already registered for signals (provided %p)" NL, expected, nc);
206 pthread_mutex_lock(&lock);
208 memset(&sa, 0,
sizeof(sa));
210 sigaddset(&sa.sa_mask, SIGWINCH);
211 sigaddset(&sa.sa_mask, SIGCONT);
213 ret |= sigaction(SIGWINCH, &sa, &old_winch);
214 ret |= sigaction(SIGCONT, &sa, &old_cont);
216 atomic_store(&signal_nc,
NULL);
217 pthread_mutex_unlock(&lock);
218 fprintf(stderr,
"error installing term signal handler (%s)" NL, strerror(errno));
223 pthread_sigmask(SIG_BLOCK, &sa.sa_mask,
NULL);
224 handling_winch =
true;
227 memset(&sa, 0,
sizeof(sa));
233 long minstksz = sysconf(_SC_SIGSTKSZ);
238 minstksz = SIGSTKSZ * 4;
240 alt_signal_stack.ss_sp = malloc(minstksz);
241 if(alt_signal_stack.ss_sp ==
NULL){
242 fprintf(stderr,
"warning: couldn't create %ldB alternate signal stack (%s)" NL, minstksz, strerror(errno));
244 alt_signal_stack.ss_size = minstksz;
245 if(sigaltstack(&alt_signal_stack,
NULL)){
246 fprintf(stderr,
"warning: couldn't set up %ldB alternate signal stack (%s)" NL, minstksz, strerror(errno));
247 free(alt_signal_stack.ss_sp);
248 alt_signal_stack.ss_sp =
NULL;
249 alt_signal_stack.ss_size = 0;
251 sa.sa_flags = SA_ONSTACK;
255 fatal_callback = handler;
256 sa.sa_sigaction = fatal_handler;
257 sigaddset(&sa.sa_mask, SIGABRT);
258 sigaddset(&sa.sa_mask, SIGBUS);
259 sigaddset(&sa.sa_mask, SIGFPE);
260 sigaddset(&sa.sa_mask, SIGILL);
261 sigaddset(&sa.sa_mask, SIGINT);
262 sigaddset(&sa.sa_mask, SIGQUIT);
263 sigaddset(&sa.sa_mask, SIGSEGV);
264 sigaddset(&sa.sa_mask, SIGTERM);
266 sa.sa_flags |= SA_SIGINFO | SA_RESETHAND;
268 ret |= sigaction(SIGABRT, &sa, &old_abrt);
269 ret |= sigaction(SIGBUS, &sa, &old_bus);
270 ret |= sigaction(SIGFPE, &sa, &old_fpe);
271 ret |= sigaction(SIGILL, &sa, &old_ill);
272 ret |= sigaction(SIGINT, &sa, &old_int);
273 ret |= sigaction(SIGQUIT, &sa, &old_quit);
274 ret |= sigaction(SIGSEGV, &sa, &old_segv);
275 ret |= sigaction(SIGTERM, &sa, &old_term);
277 atomic_store(&signal_nc,
NULL);
278 pthread_mutex_unlock(&lock);
279 fprintf(stderr,
"error installing fatal signal handlers (%s)" NL, strerror(errno));
282 handling_fatals =
true;
286 sigaddset(&wblock_signals, SIGINT);
287 sigaddset(&wblock_signals, SIGTERM);
288 sigaddset(&wblock_signals, SIGQUIT);
289 pthread_mutex_unlock(&lock);