Patchwork [2,of,4] tests: killdaemons.py for windows waits for killed process to terminate

login
register
mail settings
Submitter Simon Heimberg
Date Feb. 13, 2014, 9:29 p.m.
Message ID <86a6ffe73f730b6b8f9d.1392326968@lapsasi>
Download mbox | patch
Permalink /patch/3641/
State Accepted
Commit ea3adeac5248cb3c82566b615ad0fc07c1f7fce3
Headers show

Comments

Simon Heimberg - Feb. 13, 2014, 9:29 p.m.
# HG changeset patch
# User Simon Heimberg <simohe@besonet.ch>
# Date 1389989600 -3600
#      Fri Jan 17 21:13:20 2014 +0100
# Node ID 86a6ffe73f730b6b8f9d39d6b81e866ce4abadb2
# Parent  db87f0a6cf9e83fb7e8d66ee194c2f029faeedab
tests: killdaemons.py for windows waits for killed process to terminate

After kill, wait for the process to terminate. When it does not in time,
write a debug message similar as in other os. But no 2nd forceful attempt
is done.

Patch

diff -r db87f0a6cf9e -r 86a6ffe73f73 tests/killdaemons.py
--- a/tests/killdaemons.py	Fri Jan 17 21:13:08 2014 +0100
+++ b/tests/killdaemons.py	Fri Jan 17 21:13:20 2014 +0100
@@ -15,14 +15,28 @@ 
     def kill(pid, logfn, tryhard=True):
         logfn('# Killing daemon process %d' % pid)
         PROCESS_TERMINATE = 1
+        SYNCHRONIZE = 0x00100000L
+        WAIT_OBJECT_0 = 0
+        WAIT_TIMEOUT = 258
         handle = ctypes.windll.kernel32.OpenProcess(
-                PROCESS_TERMINATE, False, pid)
+                PROCESS_TERMINATE|SYNCHRONIZE, False, pid)
         if handle == 0:
             # TODO: call _check(0, expected) to check if "process not found"
             return # process not found, already finished
         try:
             _check(ctypes.windll.kernel32.TerminateProcess(handle, -1), 5)
             #      windows error 5 when process does not exist or no access TODO
+
+            # TODO?: forcefully kill when timeout
+            #        and ?shorter waiting time? when tryhard==True
+            r = ctypes.windll.kernel32.WaitForSingleObject(handle, 100)
+                                                       # timeout = 100 ms
+            if r == WAIT_OBJECT_0:
+                pass # process is terminated
+            elif r == WAIT_TIMEOUT:
+                logfn('# Daemon process %d is stuck')
+            else:
+                check(r) # any error
         except: #re-raises
             ctypes.windll.kernel32.CloseHandle(handle) # no _check, keep error
             raise