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