48 static volatile sig_atomic_t
sig;
54 sig = enabled ? SIG_ATOMIC_MAX : 0;
63 if (
sig == SIG_ATOMIC_MAX) {
74 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
77 if (
sig == SIG_ATOMIC_MAX) {
79 switch (e->ExceptionRecord->ExceptionCode) {
80 case EXCEPTION_FLT_DIVIDE_BY_ZERO:
81 case EXCEPTION_INT_DIVIDE_BY_ZERO:
s = SIGFPE;
break;
82 case EXCEPTION_ILLEGAL_INSTRUCTION:
83 case EXCEPTION_PRIV_INSTRUCTION:
s = SIGILL;
break;
84 case EXCEPTION_ACCESS_VIOLATION:
85 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
86 case EXCEPTION_DATATYPE_MISALIGNMENT:
87 case EXCEPTION_STACK_OVERFLOW:
s = SIGSEGV;
break;
88 case EXCEPTION_IN_PAGE_ERROR:
s = SIGBUS;
break;
89 default:
return EXCEPTION_CONTINUE_SEARCH;
94 return EXCEPTION_CONTINUE_SEARCH;
98 #elif HAVE_SIGACTION && defined(SA_RESETHAND)
102 static const struct sigaction interrupt_handler_act = {
104 .sa_flags = SA_RESETHAND,
107 static const struct sigaction signal_handler_act = {
109 .sa_flags = SA_RESETHAND,
114 if (
sig == SIG_ATOMIC_MAX) {
116 sigaction(
s, &signal_handler_act,
NULL);
124 if (
sig == SIG_ATOMIC_MAX) {
134 static int handlers_set;
139 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
144 #elif HAVE_SIGACTION && defined(SA_RESETHAND)
146 sigaction(SIGBUS, &signal_handler_act,
NULL);
148 sigaction(SIGFPE, &signal_handler_act,
NULL);
149 sigaction(SIGILL, &signal_handler_act,
NULL);
150 sigaction(SIGSEGV, &signal_handler_act,
NULL);
151 sigaction(SIGINT, &interrupt_handler_act,
NULL);
152 sigaction(SIGTERM, &interrupt_handler_act,
NULL);
170 case SIGFPE:
return "fatal arithmetic error";
171 case SIGILL:
return "illegal instruction";
173 case SIGBUS:
return "bus error";
175 case SIGSEGV:
return "segmentation fault";
176 case SIGINT:
return "interrupted";
177 case SIGTERM:
return "terminated";
178 default:
return NULL;