From 11e4f68d71e7313ffd0252f64ba9fec647f0a31f Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner <inform@tiker.net> Date: Sat, 28 Nov 2015 15:41:04 -0500 Subject: [PATCH] Try and handle ^C through set{switch,check}interval rather than (slow) signal handlers --- gen_wrap.py | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/gen_wrap.py b/gen_wrap.py index d77449a..72c4795 100644 --- a/gen_wrap.py +++ b/gen_wrap.py @@ -315,7 +315,6 @@ from __future__ import print_function import six import sys -import signal import logging import threading @@ -432,22 +431,22 @@ class _ManagedCString(object): libc.free(self.data) -class DelayedKeyboardInterrupt(object): - def __enter__(self): - self.signal_received = False - if isinstance(threading.current_thread(), threading._MainThread): - self.old_handler = signal.getsignal(signal.SIGINT) - signal.signal(signal.SIGINT, self.handler) +if _PY3: + class DelayedKeyboardInterrupt(object): + def __enter__(self): + self.previous_switch_interval = sys.getswitchinterval() + sys.setswitchinterval(10000000000000) - def handler(self, signal, frame): - self.signal_received = (signal, frame) - logging.debug('SIGINT received. Delaying KeyboardInterrupt.') + def __exit__(self, type, value, traceback): + sys.setswitchinterval(self.previous_switch_interval) +else: + class DelayedKeyboardInterrupt(object): + def __enter__(self): + self.previous_check_interval = sys.getcheckinterval() + sys.setcheckinterval(10000000000000) - def __exit__(self, type, value, traceback): - if isinstance(threading.current_thread(), threading._MainThread): - signal.signal(signal.SIGINT, self.old_handler) - if self.signal_received: - self.old_handler(*self.signal_received) + def __exit__(self, type, value, traceback): + sys.setcheckinterval(self.previous_check_interval) """ CLASS_MAP = { -- GitLab