]>
Commit | Line | Data |
---|---|---|
4710c53d | 1 | import signal\r |
2 | import weakref\r | |
3 | \r | |
4 | from functools import wraps\r | |
5 | \r | |
6 | __unittest = True\r | |
7 | \r | |
8 | \r | |
9 | class _InterruptHandler(object):\r | |
10 | def __init__(self, default_handler):\r | |
11 | self.called = False\r | |
12 | self.default_handler = default_handler\r | |
13 | \r | |
14 | def __call__(self, signum, frame):\r | |
15 | installed_handler = signal.getsignal(signal.SIGINT)\r | |
16 | if installed_handler is not self:\r | |
17 | # if we aren't the installed handler, then delegate immediately\r | |
18 | # to the default handler\r | |
19 | self.default_handler(signum, frame)\r | |
20 | \r | |
21 | if self.called:\r | |
22 | self.default_handler(signum, frame)\r | |
23 | self.called = True\r | |
24 | for result in _results.keys():\r | |
25 | result.stop()\r | |
26 | \r | |
27 | _results = weakref.WeakKeyDictionary()\r | |
28 | def registerResult(result):\r | |
29 | _results[result] = 1\r | |
30 | \r | |
31 | def removeResult(result):\r | |
32 | return bool(_results.pop(result, None))\r | |
33 | \r | |
34 | _interrupt_handler = None\r | |
35 | def installHandler():\r | |
36 | global _interrupt_handler\r | |
37 | if _interrupt_handler is None:\r | |
38 | default_handler = signal.getsignal(signal.SIGINT)\r | |
39 | _interrupt_handler = _InterruptHandler(default_handler)\r | |
40 | signal.signal(signal.SIGINT, _interrupt_handler)\r | |
41 | \r | |
42 | \r | |
43 | def removeHandler(method=None):\r | |
44 | if method is not None:\r | |
45 | @wraps(method)\r | |
46 | def inner(*args, **kwargs):\r | |
47 | initial = signal.getsignal(signal.SIGINT)\r | |
48 | removeHandler()\r | |
49 | try:\r | |
50 | return method(*args, **kwargs)\r | |
51 | finally:\r | |
52 | signal.signal(signal.SIGINT, initial)\r | |
53 | return inner\r | |
54 | \r | |
55 | global _interrupt_handler\r | |
56 | if _interrupt_handler is not None:\r | |
57 | signal.signal(signal.SIGINT, _interrupt_handler.default_handler)\r |