104 pthread_mutex_lock(&lock);
105 if(atomic_compare_exchange_strong(&signal_nc, &expected, nc)){
107 sigaction(SIGWINCH, &old_winch,
NULL);
108 sigaction(SIGCONT, &old_cont,
NULL);
109 handling_winch =
false;
112 sigaction(SIGABRT, &old_abrt,
NULL);
113 sigaction(SIGBUS, &old_bus,
NULL);
114 sigaction(SIGFPE, &old_fpe,
NULL);
115 sigaction(SIGILL, &old_ill,
NULL);
116 sigaction(SIGINT, &old_int,
NULL);
117 sigaction(SIGQUIT, &old_quit,
NULL);
118 sigaction(SIGSEGV, &old_segv,
NULL);
119 sigaction(SIGTERM, &old_term,
NULL);
120 handling_fatals =
false;
122 if(alt_signal_stack.ss_sp){
123 alt_signal_stack.ss_flags = SS_DISABLE;
124 if(sigaltstack(&alt_signal_stack,
NULL)){
126 fprintf(stderr,
"couldn't remove alternate signal stack (%s)", strerror(errno));
130 *altstack = alt_signal_stack.ss_sp;
131 alt_signal_stack.ss_sp =
NULL;
132 ret = !atomic_compare_exchange_strong(&signal_nc, &expected,
NULL);
134 pthread_mutex_unlock(&lock);
136 fprintf(stderr,
"signals weren't registered for %p (had %p)", nc, expected);
189 int(*handler)(
void*,
void**)){
191 void* expected =
NULL;
195 if(!atomic_compare_exchange_strong(&signal_nc, &expected, nc)){
196 fprintf(stderr,
"%p is already registered for signals (provided %p)" NL, expected, nc);
199 pthread_mutex_lock(&lock);
201 memset(&sa, 0,
sizeof(sa));
203 sigaddset(&sa.sa_mask, SIGWINCH);
204 sigaddset(&sa.sa_mask, SIGCONT);
206 ret |= sigaction(SIGWINCH, &sa, &old_winch);
207 ret |= sigaction(SIGCONT, &sa, &old_cont);
209 atomic_store(&signal_nc,
NULL);
210 pthread_mutex_unlock(&lock);
211 fprintf(stderr,
"error installing term signal handler (%s)" NL, strerror(errno));
216 pthread_sigmask(SIG_BLOCK, &sa.sa_mask,
NULL);
217 handling_winch =
true;
220 memset(&sa, 0,
sizeof(sa));
226 long minstksz = sysconf(_SC_SIGSTKSZ);
231 minstksz = SIGSTKSZ * 4;
233 alt_signal_stack.ss_sp = malloc(minstksz);
234 if(alt_signal_stack.ss_sp ==
NULL){
235 fprintf(stderr,
"warning: couldn't create %ldB alternate signal stack (%s)" NL, minstksz, strerror(errno));
237 alt_signal_stack.ss_size = minstksz;
238 if(sigaltstack(&alt_signal_stack,
NULL)){
239 fprintf(stderr,
"warning: couldn't set up %ldB alternate signal stack (%s)" NL, minstksz, strerror(errno));
240 free(alt_signal_stack.ss_sp);
241 alt_signal_stack.ss_sp =
NULL;
242 alt_signal_stack.ss_size = 0;
244 sa.sa_flags = SA_ONSTACK;
248 fatal_callback = handler;
249 sa.sa_sigaction = fatal_handler;
250 sigaddset(&sa.sa_mask, SIGABRT);
251 sigaddset(&sa.sa_mask, SIGBUS);
252 sigaddset(&sa.sa_mask, SIGFPE);
253 sigaddset(&sa.sa_mask, SIGILL);
254 sigaddset(&sa.sa_mask, SIGINT);
255 sigaddset(&sa.sa_mask, SIGQUIT);
256 sigaddset(&sa.sa_mask, SIGSEGV);
257 sigaddset(&sa.sa_mask, SIGTERM);
259 sa.sa_flags |= SA_SIGINFO | SA_RESETHAND;
261 ret |= sigaction(SIGABRT, &sa, &old_abrt);
262 ret |= sigaction(SIGBUS, &sa, &old_bus);
263 ret |= sigaction(SIGFPE, &sa, &old_fpe);
264 ret |= sigaction(SIGILL, &sa, &old_ill);
265 ret |= sigaction(SIGINT, &sa, &old_int);
266 ret |= sigaction(SIGQUIT, &sa, &old_quit);
267 ret |= sigaction(SIGSEGV, &sa, &old_segv);
268 ret |= sigaction(SIGTERM, &sa, &old_term);
270 atomic_store(&signal_nc,
NULL);
271 pthread_mutex_unlock(&lock);
272 fprintf(stderr,
"error installing fatal signal handlers (%s)" NL, strerror(errno));
275 handling_fatals =
true;
279 sigaddset(&wblock_signals, SIGINT);
280 sigaddset(&wblock_signals, SIGTERM);
281 sigaddset(&wblock_signals, SIGQUIT);
282 pthread_mutex_unlock(&lock);