int fd;
int all_threads;
PyInterpreterState *interp;
+#ifdef MS_WINDOWS
+ void *exc_handler;
+#endif
} fatal_error = {0, NULL, -1, 0};
#ifdef FAULTHANDLER_LATER
if (code == EXCEPTION_ACCESS_VIOLATION) {
/* disable signal handler for SIGSEGV */
- size_t i;
- for (i=0; i < faulthandler_nsignals; i++) {
+ for (size_t i=0; i < faulthandler_nsignals; i++) {
fault_handler_t *handler = &faulthandler_handlers[i];
if (handler->signum == SIGSEGV) {
faulthandler_disable_fatal_handler(handler);
static int
faulthandler_enable(void)
{
- size_t i;
-
if (fatal_error.enabled) {
return 0;
}
fatal_error.enabled = 1;
- for (i=0; i < faulthandler_nsignals; i++) {
+ for (size_t i=0; i < faulthandler_nsignals; i++) {
fault_handler_t *handler;
#ifdef HAVE_SIGACTION
struct sigaction action;
}
#ifdef MS_WINDOWS
- AddVectoredExceptionHandler(1, faulthandler_exc_handler);
+ assert(fatal_error.exc_handler == NULL);
+ fatal_error.exc_handler = AddVectoredExceptionHandler(1, faulthandler_exc_handler);
#endif
return 0;
}
static void
faulthandler_disable(void)
{
- unsigned int i;
- fault_handler_t *handler;
-
if (fatal_error.enabled) {
fatal_error.enabled = 0;
- for (i=0; i < faulthandler_nsignals; i++) {
+ for (size_t i=0; i < faulthandler_nsignals; i++) {
+ fault_handler_t *handler;
handler = &faulthandler_handlers[i];
faulthandler_disable_fatal_handler(handler);
}
}
-
+#ifdef MS_WINDOWS
+ if (fatal_error.exc_handler != NULL) {
+ RemoveVectoredExceptionHandler(fatal_error.exc_handler);
+ fatal_error.exc_handler = NULL;
+ }
+#endif
Py_CLEAR(fatal_error.file);
}
static int
check_signum(int signum)
{
- unsigned int i;
-
- for (i=0; i < faulthandler_nsignals; i++) {
+ for (size_t i=0; i < faulthandler_nsignals; i++) {
if (faulthandler_handlers[i].signum == signum) {
PyErr_Format(PyExc_RuntimeError,
"signal %i cannot be registered, "
static int
faulthandler_traverse(PyObject *module, visitproc visit, void *arg)
{
-#ifdef FAULTHANDLER_USER
- unsigned int signum;
-#endif
-
#ifdef FAULTHANDLER_LATER
Py_VISIT(thread.file);
#endif
#ifdef FAULTHANDLER_USER
if (user_signals != NULL) {
- for (signum=0; signum < NSIG; signum++)
+ for (size_t signum=0; signum < NSIG; signum++)
Py_VISIT(user_signals[signum].file);
}
#endif
void _PyFaulthandler_Fini(void)
{
-#ifdef FAULTHANDLER_USER
- unsigned int signum;
-#endif
-
#ifdef FAULTHANDLER_LATER
/* later */
if (thread.cancel_event) {
#ifdef FAULTHANDLER_USER
/* user */
if (user_signals != NULL) {
- for (signum=0; signum < NSIG; signum++)
+ for (size_t signum=0; signum < NSIG; signum++) {
faulthandler_unregister(&user_signals[signum], signum);
+ }
PyMem_Free(user_signals);
user_signals = NULL;
}