summary refs log tree commit diff stats
path: root/ranger/ext/vcs
diff options
context:
space:
mode:
authorael-code <tommy.ael@gmail.com>2016-11-11 13:12:20 +0100
committernfnty <git@nfnty.se>2017-01-29 23:16:30 +0100
commit62a77e71426ce4e08e410e065ef8789e8dfa6ee8 (patch)
tree8eed4b2bdd04fc2561d6b8d671c3734fd66aa849 /ranger/ext/vcs
parentad51cca4893b214d9428248572f7d0b518c9a285 (diff)
downloadranger-62a77e71426ce4e08e410e065ef8789e8dfa6ee8.tar.gz
core.main: Refactor exit handling
Decrease complexity
Do not ignore system exit exceptions
Properly destroy UI
Diffstat (limited to 'ranger/ext/vcs')
-rw-r--r--ranger/ext/vcs/vcs.py18
1 files changed, 15 insertions, 3 deletions
diff --git a/ranger/ext/vcs/vcs.py b/ranger/ext/vcs/vcs.py
index 00f51152..fa5c04c0 100644
--- a/ranger/ext/vcs/vcs.py
+++ b/ranger/ext/vcs/vcs.py
@@ -374,13 +374,14 @@ class VcsThread(threading.Thread):  # pylint: disable=too-many-instance-attribut
     def __init__(self, ui):
         super(VcsThread, self).__init__()
         self.daemon = True
-        self.ui = ui  # pylint: disable=invalid-name
+        self.ui = ui
         self.queue = queue.Queue()
+        self._stop = threading.Event()
+        self.stopped = threading.Event()
         self.advance = threading.Event()
         self.advance.set()
         self.paused = threading.Event()
         self.awoken = threading.Event()
-        self.timestamp = time.time()
         self.redraw = False
         self.roots = set()
 
@@ -454,10 +455,13 @@ class VcsThread(threading.Thread):  # pylint: disable=too-many-instance-attribut
             self.paused.set()
             self.advance.wait()
             self.awoken.wait()
+            if self._stop.isSet():
+                self.stopped.set()
+                return
             if not self.advance.isSet():
                 continue
-            self.paused.clear()
             self.awoken.clear()
+            self.paused.clear()
 
             try:
                 self._queue_process()
@@ -472,6 +476,14 @@ class VcsThread(threading.Thread):  # pylint: disable=too-many-instance-attribut
             except Exception as ex:  # pylint: disable=broad-except
                 self.ui.fm.notify('VCS Exception: View log for more info', bad=True, exception=ex)
 
+    def stop(self):
+        """Stop thread synchronously"""
+        self._stop.set()
+        self.paused.wait()
+        self.advance.set()
+        self.awoken.set()
+        self.stopped.wait()
+
     def pause(self):
         """Pause thread"""
         self.advance.clear()