Rev 38: Catch zombies after kill, if any. in http://bazaar.launchpad.net/%7Evila/bzr/local-test-server

Vincent Ladeuil v.ladeuil+lp at free.fr
Tue Jun 24 17:56:57 BST 2008


At http://bazaar.launchpad.net/%7Evila/bzr/local-test-server

------------------------------------------------------------
revno: 38
revision-id: v.ladeuil+lp at free.fr-20080624165649-w5xzsgiexl8z8em8
parent: v.ladeuil+lp at free.fr-20080624165255-qq035rl1krim1oi4
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: local_test_server
timestamp: Tue 2008-06-24 18:56:49 +0200
message:
  Catch zombies after kill, if any.
  
  * server.py:
  (Server._kill_server): Renamed and generalized from
  _kill_server_with_SIGTERM. Also catch zombies if any.
  (Server._wait_for_server_process_death): Generalized.
modified:
  server.py                      server.py-20080524160639-rqhbexqatjqbwypw-1
-------------- next part --------------
=== modified file 'server.py'
--- a/server.py	2008-06-13 15:10:45 +0000
+++ b/server.py	2008-06-24 16:56:49 +0000
@@ -228,25 +228,36 @@
         """
         return self._hk_poll(self.is_running)
 
-    def _kill_server_with_SIGTERM(self, pid):
+    def _kill_server(self, pid, sig):
         try:
-            os.kill(pid, signal.SIGTERM)
+            os.kill(pid, sig)
         except OSError, e:
             if e.errno == errno.ESRCH:
                 # The process doesn't exist anymore
                 return True
             else:
                 raise
+        # Catch zombies
+        try:
+            os.waitpid(pid, os.WNOHANG)
+        except OSError, e:
+            if e.errno == errno.ECHILD:
+                # The process doesn't exist anymore
+                pass
+            else:
+                raise
         return False
 
-    def _wait_for_server_process_death(self):
+    def _wait_for_server_process_death(self, sig=None):
+        if sig is None:
+            sig = signal.SIGTERM
 
         def server_is_dead():
             pid = self.get_pid()
             if pid is None:
                 return True
             else:
-                killed = self._kill_server_with_SIGTERM(pid)
+                killed = self._kill_server(pid, sig)
                 return killed
 
         return self._hk_poll(server_is_dead, interval=500.0)



More information about the bazaar-commits mailing list