summaryrefslogtreecommitdiff
path: root/src/leap/bitmask/app.py
diff options
context:
space:
mode:
authorKali Kaneko <kali@leap.se>2014-07-09 00:39:36 -0500
committerKali Kaneko <kali@leap.se>2014-07-11 14:34:08 -0500
commit543296a62235d5303662720d3f341e1dc10d478e (patch)
tree8bdb9b35ac2cf19ad56780836579fc0ba497d4f1 /src/leap/bitmask/app.py
parent3fa1ec572a4c8ca752412e70af9ad0b9744933e0 (diff)
invoke mainwindow.quit only from parent pid
because the fork happens after the registration of the signal handler, all children processes were inheriting the handler (and being passed a reference to the mainwindow object, ugh...)
Diffstat (limited to 'src/leap/bitmask/app.py')
-rw-r--r--src/leap/bitmask/app.py67
1 files changed, 43 insertions, 24 deletions
diff --git a/src/leap/bitmask/app.py b/src/leap/bitmask/app.py
index 6a7d6ff1..d0906b7c 100644
--- a/src/leap/bitmask/app.py
+++ b/src/leap/bitmask/app.py
@@ -49,7 +49,6 @@ from PySide import QtCore, QtGui
from leap.bitmask import __version__ as VERSION
from leap.bitmask.config import flags
-from leap.bitmask.gui import locale_rc # noqa - silence pylint
from leap.bitmask.gui.mainwindow import MainWindow
from leap.bitmask.logs.utils import create_logger
from leap.bitmask.platform_init.locks import we_are_the_one_and_only
@@ -67,16 +66,39 @@ import codecs
codecs.register(lambda name: codecs.lookup('utf-8')
if name == 'cp65001' else None)
+import psutil
+
+
+def kill_the_children():
+ """
+ Make sure no lingering subprocesses are left in case of a bad termination.
+ """
+ me = os.getpid()
+ parent = psutil.Process(me)
+ print "Killing all the children processes..."
+ for child in parent.get_children(recursive=True):
+ try:
+ child.terminate()
+ except Exception as exc:
+ print exc
+
+# XXX This is currently broken, but we need to fix it to avoid
+# orphaned processes in case of a crash.
+#atexit.register(kill_the_children)
+
def sigint_handler(*args, **kwargs):
"""
Signal handler for SIGINT
"""
logger = kwargs.get('logger', None)
- if logger:
- logger.debug("SIGINT catched. shutting down...")
- mainwindow = args[0]
- mainwindow.quit()
+ parentpid = kwargs.get('parentpid', None)
+ pid = os.getpid()
+ if parentpid == pid:
+ if logger:
+ logger.debug("SIGINT catched. shutting down...")
+ mainwindow = args[0]
+ mainwindow.quit()
def sigterm_handler(*args, **kwargs):
@@ -85,10 +107,13 @@ def sigterm_handler(*args, **kwargs):
This handler is actually passed to twisted reactor
"""
logger = kwargs.get('logger', None)
- if logger:
- logger.debug("SIGTERM catched. shutting down...")
- mainwindow = args[0]
- mainwindow.quit()
+ parentpid = kwargs.get('parentpid', None)
+ pid = os.getpid()
+ if parentpid == pid:
+ if logger:
+ logger.debug("SIGTERM catched. shutting down...")
+ mainwindow = args[0]
+ mainwindow.quit()
def do_display_version(opts):
@@ -203,32 +228,26 @@ def main():
app.setApplicationName("leap")
app.setOrganizationDomain("leap.se")
- # XXX ---------------------------------------------------------
- # In quarantine, looks like we don't need it anymore.
- # This dummy timer ensures that control is given to the outside
- # loop, so we can hook our sigint handler.
- #timer = QtCore.QTimer()
- #timer.start(500)
- #timer.timeout.connect(lambda: None)
- # XXX ---------------------------------------------------------
-
window = MainWindow(bypass_checks=bypass_checks,
start_hidden=start_hidden)
- sigint_window = partial(sigint_handler, window, logger=logger)
+ mainpid = os.getpid()
+ sigint_window = partial(sigint_handler, window,
+ logger=logger, parentpid=mainpid)
signal.signal(signal.SIGINT, sigint_window)
# callable used in addSystemEventTrigger to handle SIGTERM
- sigterm_window = partial(sigterm_handler, window, logger=logger)
-
- l = LoopingCall(QtCore.QCoreApplication.processEvents, 0, 10)
- l.start(0.01)
-
+ sigterm_window = partial(sigterm_handler, window,
+ logger=logger, parentpid=mainpid)
# SIGTERM can't be handled the same way SIGINT is, since it's
# caught by twisted. See _handleSignals method in
# twisted/internet/base.py#L1150. So, addSystemEventTrigger
# reactor's method is used.
reactor.addSystemEventTrigger('before', 'shutdown', sigterm_window)
+
+ l = LoopingCall(QtCore.QCoreApplication.processEvents, 0, 10)
+ l.start(0.01)
+
reactor.run()
if __name__ == "__main__":