| Viewing file:  signals.py (2.35 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
import signalimport weakref
 
 from functools import wraps
 
 __unittest = True
 
 
 class _InterruptHandler(object):
 def __init__(self, default_handler):
 self.called = False
 self.original_handler = default_handler
 if isinstance(default_handler, int):
 if default_handler == signal.SIG_DFL:
 # Pretend it's signal.default_int_handler instead.
 default_handler = signal.default_int_handler
 elif default_handler == signal.SIG_IGN:
 # Not quite the same thing as SIG_IGN, but the closest we
 # can make it: do nothing.
 def default_handler(unused_signum, unused_frame):
 pass
 else:
 raise TypeError("expected SIGINT signal handler to be "
 "signal.SIG_IGN, signal.SIG_DFL, or a "
 "callable object")
 self.default_handler = default_handler
 
 def __call__(self, signum, frame):
 installed_handler = signal.getsignal(signal.SIGINT)
 if installed_handler is not self:
 # if we aren't the installed handler, then delegate immediately
 # to the default handler
 self.default_handler(signum, frame)
 
 if self.called:
 self.default_handler(signum, frame)
 self.called = True
 for result in _results.keys():
 result.stop()
 
 _results = weakref.WeakKeyDictionary()
 def registerResult(result):
 _results[result] = 1
 
 def removeResult(result):
 return bool(_results.pop(result, None))
 
 _interrupt_handler = None
 def installHandler():
 global _interrupt_handler
 if _interrupt_handler is None:
 default_handler = signal.getsignal(signal.SIGINT)
 _interrupt_handler = _InterruptHandler(default_handler)
 signal.signal(signal.SIGINT, _interrupt_handler)
 
 
 def removeHandler(method=None):
 if method is not None:
 @wraps(method)
 def inner(*args, **kwargs):
 initial = signal.getsignal(signal.SIGINT)
 removeHandler()
 try:
 return method(*args, **kwargs)
 finally:
 signal.signal(signal.SIGINT, initial)
 return inner
 
 global _interrupt_handler
 if _interrupt_handler is not None:
 signal.signal(signal.SIGINT, _interrupt_handler.original_handler)
 
 |