[tor-commits] [arm/master] Moving daemon shutdown into starter

atagar at torproject.org atagar at torproject.org
Mon Oct 21 21:10:15 UTC 2013


commit 94edb695c859011f6d462a34eadbecea56771697
Author: Damian Johnson <atagar at torproject.org>
Date:   Fri Oct 18 11:55:45 2013 -0700

    Moving daemon shutdown into starter
    
    Well, that was silly. We always want to shut down daemons on termination so we
    had three _shutdown_daemons() calls sprinkled around. Moving this to a single
    spot at the end of the starter.
---
 arm/controller.py |   32 ++------------------------------
 arm/starter.py    |   49 +++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 49 insertions(+), 32 deletions(-)

diff --git a/arm/controller.py b/arm/controller.py
index 0b6b383..190aee5 100644
--- a/arm/controller.py
+++ b/arm/controller.py
@@ -23,7 +23,7 @@ import arm.connections.connPanel
 
 from stem.control import State, Controller
 
-from arm.util import connections, hostnames, panel, sysTools, torConfig, torTools
+from arm.util import connections, panel, torConfig, torTools
 
 from stem.util import conf, enum, log, system
 
@@ -469,34 +469,6 @@ class Controller:
       try: torTools.getConn().shutdown()
       except IOError, exc: arm.popups.showMsg(str(exc), 3, curses.A_BOLD)
 
-def shutdownDaemons():
-  """
-  Stops and joins on worker threads.
-  """
-
-  # prevents further worker threads from being spawned
-  torTools.NO_SPAWN = True
-
-  # stops panel daemons
-  control = getController()
-
-  if control:
-    for panelImpl in control.getDaemonPanels(): panelImpl.stop()
-    for panelImpl in control.getDaemonPanels(): panelImpl.join()
-
-  # joins on stem threads
-  torTools.getConn().close()
-
-  # joins on utility daemon threads - this might take a moment since the
-  # internal threadpools being joined might be sleeping
-  hostnames.stop()
-  resourceTrackers = sysTools.RESOURCE_TRACKERS.values()
-  resolver = connections.get_resolver() if connections.get_resolver().is_alive() else None
-  for tracker in resourceTrackers: tracker.stop()
-  if resolver: resolver.stop()  # sets halt flag (returning immediately)
-  for tracker in resourceTrackers: tracker.join()
-  if resolver: resolver.join()  # joins on halted resolver
-
 def heartbeatCheck(isUnresponsive):
   """
   Logs if its been ten seconds since the last BW event.
@@ -635,5 +607,5 @@ def start_arm(stdscr):
         isKeystrokeConsumed = panelImpl.handleKey(key)
         if isKeystrokeConsumed: break
 
-  shutdownDaemons()
+  panel.HALT_ACTIVITY = True
 
diff --git a/arm/starter.py b/arm/starter.py
index 757cf04..d7c68f9 100644
--- a/arm/starter.py
+++ b/arm/starter.py
@@ -18,7 +18,10 @@ import time
 import arm
 import arm.controller
 import arm.logPanel
+import arm.util.connections
+import arm.util.hostnames
 import arm.util.panel
+import arm.util.sysTools
 import arm.util.torConfig
 import arm.util.torTools
 import arm.util.uiTools
@@ -261,6 +264,48 @@ def _armrc_dump(armrc_path):
     return "[unable to read file: %s]" % exc.strerror
 
 
+def _shutdown_daemons():
+  """
+  Stops and joins on worker threads.
+  """
+
+  # prevents further worker threads from being spawned
+  arm.util.torTools.NO_SPAWN = True
+
+  # stops panel daemons
+  control = arm.controller.getController()
+
+  if control:
+    for panel_impl in control.getDaemonPanels():
+      panel_impl.stop()
+
+    for panel_impl in control.getDaemonPanels():
+      panel_impl.join()
+
+  # joins on stem threads
+  arm.util.torTools.getConn().close()
+
+  # joins on utility daemon threads - this might take a moment since the
+  # internal threadpools being joined might be sleeping
+
+  arm.util.hostnames.stop()
+
+  resourceTrackers = arm.util.sysTools.RESOURCE_TRACKERS.values()
+  resolver = arm.util.connections.get_resolver() if arm.util.connections.get_resolver().is_alive() else None
+
+  for tracker in resourceTrackers:
+    tracker.stop()
+
+  if resolver:
+    resolver.stop()  # sets halt flag (returning immediately)
+
+  for tracker in resourceTrackers:
+    tracker.join()
+
+  if resolver:
+    resolver.join()  # joins on halted resolver
+
+
 def main():
   config = stem.util.conf.get_config("arm")
   config.set('attribute.start_time', str(int(time.time())))
@@ -403,7 +448,6 @@ def main():
     curses.wrapper(arm.controller.start_arm)
   except UnboundLocalError as exc:
     if os.environ['TERM'] != 'xterm':
-      arm.controller.shutdownDaemons()
       print CONFIG['msg.unknown_term'].format(term = os.environ['TERM'])
     else:
       raise exc
@@ -415,7 +459,8 @@ def main():
     # is set) but I've never seen it happen in practice.
 
     arm.util.panel.HALT_ACTIVITY = True
-    arm.controller.shutdownDaemons()
+  finally:
+    _shutdown_daemons()
 
 if __name__ == '__main__':
   main()





More information about the tor-commits mailing list