Browse Source

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

Bastien Sevajol (Algoo) 8 years ago
parent
commit
16bbd2d5a2
2 changed files with 7 additions and 16 deletions
  1. 0 1
      tracim/tracim/lib/daemons.py
  2. 7 15
      tracim/tracim/lib/utils.py

+ 0 - 1
tracim/tracim/lib/daemons.py View File

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

+ 7 - 15
tracim/tracim/lib/utils.py View File

@@ -1,5 +1,5 @@
1 1
 # -*- coding: utf-8 -*-
2
-
2
+import os
3 3
 import time
4 4
 import signal
5 5
 
@@ -49,23 +49,15 @@ def NotImplemented():
49 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 54
     Add a callback attached to python signal.
55 55
     :param signal_id: signal identifier (eg. signal.SIGTERM)
56 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)