comparison tests/test_util.py @ 483:37718f514acb

No os.kill() in Windows, use ctypes to call Win32 TerminateProcess()
author Risto Kankkunen <risto.kankkunen@iki.fi>
date Wed, 29 Jul 2009 19:01:13 +0300
parents 83fcb1cf6d8f
children 5607e81ba616
comparison
equal deleted inserted replaced
482:a42fb4f1716a 483:37718f514acb
23 # Documentation for Subprocess.Popen() says: 23 # Documentation for Subprocess.Popen() says:
24 # "Note that on Windows, you cannot set close_fds to true and 24 # "Note that on Windows, you cannot set close_fds to true and
25 # also redirect the standard handles by setting stdin, stdout or 25 # also redirect the standard handles by setting stdin, stdout or
26 # stderr." 26 # stderr."
27 canCloseFds='win32' not in sys.platform 27 canCloseFds='win32' not in sys.platform
28
29 if not 'win32' in sys.platform:
30 def kill_process(popen_obj):
31 os.kill(popen_obj.pid, 9)
32 else:
33 import ctypes
34 from ctypes.wintypes import BOOL, DWORD, HANDLE, UINT
35
36 def win_status_check(result, func, args):
37 if result == 0:
38 raise ctypes.WinError()
39 return args
40
41 def WINAPI(returns, func, *params):
42 assert len(params) % 2 == 0
43
44 func.argtypes = tuple(params[0::2])
45 func.resvalue = returns
46 func.errcheck = win_status_check
47
48 return func
49
50 # dwDesiredAccess
51 PROCESS_TERMINATE = 0x0001
52
53 OpenProcess = WINAPI(HANDLE, ctypes.windll.kernel32.OpenProcess,
54 DWORD, 'dwDesiredAccess',
55 BOOL, 'bInheritHandle',
56 DWORD, 'dwProcessId',
57 )
58
59 CloseHandle = WINAPI(BOOL, ctypes.windll.kernel32.CloseHandle,
60 HANDLE, 'hObject'
61 )
62
63 TerminateProcess = WINAPI(BOOL, ctypes.windll.kernel32.TerminateProcess,
64 HANDLE, 'hProcess',
65 UINT, 'uExitCode'
66 )
67
68 def kill_process(popen_obj):
69 phnd = OpenProcess(PROCESS_TERMINATE, False, popen_obj.pid)
70 TerminateProcess(phnd, 1)
71 CloseHandle(phnd)
28 72
29 # Fixtures that need to be pulled at a subdirectory of the repo path 73 # Fixtures that need to be pulled at a subdirectory of the repo path
30 subdir = {'truncatedhistory.svndump': '/project2', 74 subdir = {'truncatedhistory.svndump': '/project2',
31 'fetch_missing_files_subdir.svndump': '/foo', 75 'fetch_missing_files_subdir.svndump': '/foo',
32 'empty_dir_in_trunk_not_repo_root.svndump': '/project', 76 'empty_dir_in_trunk_not_repo_root.svndump': '/project',