浏览代码

Closes #106: Rewrite signal handling of deamons to correctly continue signal after handling

Bastien Sevajol (Algoo) 8 年前
父节点
当前提交
16bbd2d5a2
共有 2 个文件被更改,包括 7 次插入16 次删除
  1. 0 1
      tracim/tracim/lib/daemons.py
  2. 7 15
      tracim/tracim/lib/utils.py

+ 0 - 1
tracim/tracim/lib/daemons.py 查看文件

21
     def __init__(self):
21
     def __init__(self):
22
         self._running_daemons = {}
22
         self._running_daemons = {}
23
         add_signal_handler(signal.SIGTERM, self.stop_all)
23
         add_signal_handler(signal.SIGTERM, self.stop_all)
24
-        add_signal_handler(signal.SIGINT, self.stop_all)
25
 
24
 
26
     def run(self, name: str, daemon_class: object, **kwargs) -> None:
25
     def run(self, name: str, daemon_class: object, **kwargs) -> None:
27
         """
26
         """

+ 7 - 15
tracim/tracim/lib/utils.py 查看文件

1
 # -*- coding: utf-8 -*-
1
 # -*- coding: utf-8 -*-
2
-
2
+import os
3
 import time
3
 import time
4
 import signal
4
 import signal
5
 
5
 
49
     raise NotImplementedError()
49
     raise NotImplementedError()
50
 
50
 
51
 
51
 
52
-def add_signal_handler(signal_id, handler, execute_before=True) -> None:
52
+def add_signal_handler(signal_id, handler) -> None:
53
     """
53
     """
54
     Add a callback attached to python signal.
54
     Add a callback attached to python signal.
55
     :param signal_id: signal identifier (eg. signal.SIGTERM)
55
     :param signal_id: signal identifier (eg. signal.SIGTERM)
56
     :param handler: callback to execute when signal trig
56
     :param handler: callback to execute when signal trig
57
-    :param execute_before: If True, callback is executed before eventual
58
-    existing callback on given dignal id.
59
     """
57
     """
60
-    previous_handler = signal.getsignal(signal_id)
61
-
62
-    def call_callback(*args, **kwargs):
63
-        if not execute_before and callable(previous_handler):
64
-            previous_handler(*args, **kwargs)
65
-
66
-        handler(*args, **kwargs)
67
-
68
-        if execute_before and callable(previous_handler):
69
-            previous_handler(*args, **kwargs)
58
+    def _handler(*args, **kwargs):
59
+        handler()
60
+        signal.signal(signal_id, signal.SIG_DFL)
61
+        os.kill(os.getpid(), signal_id)  # Rethrow signal
70
 
62
 
71
-    signal.signal(signal_id, call_callback)
63
+    signal.signal(signal_id, _handler)