annotate upreckon/win32.py @ 255:d32b14e5a43b default tip

Added support for LZMA/XZ-compressed tar files (Python 3.3+)
author Oleg Oshmyan <chortos@inbox.lv>
date Sun, 19 Oct 2014 01:33:22 +0200
parents d3a5d1929ad2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
250
acd70a60bc17 Finished embracing time.monotonic in Python code
Oleg Oshmyan <chortos@inbox.lv>
parents: 226
diff changeset
1 # Copyright (c) 2010-2014 Chortos-2 <chortos@inbox.lv>
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
2
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
3 from __future__ import division, with_statement
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
4
146
d5b6708c1955 Distutils support, reorganization and cleaning up
Oleg Oshmyan <chortos@inbox.lv>
parents: 142
diff changeset
5 from .compat import *
d5b6708c1955 Distutils support, reorganization and cleaning up
Oleg Oshmyan <chortos@inbox.lv>
parents: 142
diff changeset
6 from .exceptions import *
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
7
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
8 from ctypes import *
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
9 from ctypes.wintypes import *
82
06356af50bf9 Finished testcases reorganization and CPU time limit implementation
Oleg Oshmyan <chortos@inbox.lv>
parents: 81
diff changeset
10 from msvcrt import getch as pause
141
dfde0f5e0984 A couple of Win32 fixes
Oleg Oshmyan <chortos@inbox.lv>
parents: 140
diff changeset
11 import os, subprocess, sys, time
95
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
12
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
13 try:
250
acd70a60bc17 Finished embracing time.monotonic in Python code
Oleg Oshmyan <chortos@inbox.lv>
parents: 226
diff changeset
14 from time import monotonic as clock
acd70a60bc17 Finished embracing time.monotonic in Python code
Oleg Oshmyan <chortos@inbox.lv>
parents: 226
diff changeset
15 except ImportError:
acd70a60bc17 Finished embracing time.monotonic in Python code
Oleg Oshmyan <chortos@inbox.lv>
parents: 226
diff changeset
16 from time import clock
acd70a60bc17 Finished embracing time.monotonic in Python code
Oleg Oshmyan <chortos@inbox.lv>
parents: 226
diff changeset
17
acd70a60bc17 Finished embracing time.monotonic in Python code
Oleg Oshmyan <chortos@inbox.lv>
parents: 226
diff changeset
18 try:
95
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
19 from _winreg import *
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
20 except ImportError:
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
21 from winreg import *
85
741ae3391b61 Moved clock/time detection into platform-specific modules and testcases
Oleg Oshmyan <chortos@inbox.lv>
parents: 82
diff changeset
22
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
23 # Defaults that may be overwritten by values from _subprocess
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
24 INFINITE = -1
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
25 STD_INPUT_HANDLE = -10
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
26 WAIT_OBJECT_0 = 0
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
27
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
28 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
29 from _subprocess import *
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
30 except ImportError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
31 pass
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
32
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
33 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
34 from numbers import Integral
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
35 except ImportError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
36 Integral = int, long
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
37
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
38 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
39 from collections import namedtuple
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
40 except ImportError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
41 from operator import itemgetter
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
42 class ProcessTimes(tuple):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
43 __slots__ = ()
140
388ae061c915 The win32 module now trusts the wall-clock time reported by GetProcessTimes
Oleg Oshmyan <chortos@inbox.lv>
parents: 134
diff changeset
44 def __new__(cls, creation, exit, kernel, user):
388ae061c915 The win32 module now trusts the wall-clock time reported by GetProcessTimes
Oleg Oshmyan <chortos@inbox.lv>
parents: 134
diff changeset
45 return tuple.__new__(cls, (creation, exit, kernel, user))
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
46 __getnewargs__ = lambda self: tuple(self)
140
388ae061c915 The win32 module now trusts the wall-clock time reported by GetProcessTimes
Oleg Oshmyan <chortos@inbox.lv>
parents: 134
diff changeset
47 creation, exit, kernel, user = map(property, map(itemgetter, range(4)))
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
48 else:
140
388ae061c915 The win32 module now trusts the wall-clock time reported by GetProcessTimes
Oleg Oshmyan <chortos@inbox.lv>
parents: 134
diff changeset
49 ProcessTimes = namedtuple('ProcessTimes', 'creation exit kernel user')
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
50
155
f8041e1e4d0d win32 now includes its App-Path-aware Popen wrapper in its __all__
Oleg Oshmyan <chortos@inbox.lv>
parents: 148
diff changeset
51 __all__ = 'call', 'kill', 'pause', 'clock', 'Popen'
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
52
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
53
95
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
54 from functools import wraps
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
55 pathext = [''] + os.environ['PATHEXT'].split(';')
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
56 @wraps(subprocess.Popen)
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
57 def Popen(cmdline, *args, **kwargs):
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
58 try:
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
59 return subprocess.Popen(cmdline, *args, **kwargs)
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
60 except WindowsError:
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
61 for ext in pathext:
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
62 path = cmdline[0] + ext
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
63 newcmdline = type(cmdline)((path,)) + cmdline[1:]
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
64 try:
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
65 return subprocess.Popen(newcmdline, *args, **kwargs)
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
66 except WindowsError:
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
67 pass
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
68 for branch in HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE:
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
69 try:
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
70 path = (R'SOFTWARE\Microsoft\Windows\CurrentVersion'
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
71 R'\App Paths\%s%s' % (cmdline[0], ext))
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
72 path = QueryValue(branch, path)
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
73 break
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
74 except WindowsError:
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
75 pass
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
76 else:
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
77 continue
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
78 if path[0] == '"' == path[-1]:
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
79 path = path[1:-1]
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
80 newcmdline = type(cmdline)((path,)) + cmdline[1:]
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
81 try:
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
82 return subprocess.Popen(newcmdline, *args, **kwargs)
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
83 except WindowsError:
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
84 pass
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
85 # I'd like to transparently re-raise the exception generated
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
86 # on the very first try, but syntax differences preclude me from
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
87 # doing so in Python 2 and it can't be done at all in Python 3
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
88 raise
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
89
6c2997616bdf Added a search for the location of the executable for Popen on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 91
diff changeset
90
134
e84f33a60a5c Moved process killing logic into platform-specific modules
Oleg Oshmyan <chortos@inbox.lv>
parents: 131
diff changeset
91 # Automatically convert _subprocess handle objects into low-level
e84f33a60a5c Moved process killing logic into platform-specific modules
Oleg Oshmyan <chortos@inbox.lv>
parents: 131
diff changeset
92 # HANDLEs and replicate their functionality for our own use
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
93 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
94 _subprocess_handle = type(GetCurrentProcess())
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
95 except NameError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
96 _subprocess_handle = Integral
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
97 class Handle(object):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
98 @staticmethod
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
99 def from_param(handle):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
100 if isinstance(handle, (_subprocess_handle, Integral)):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
101 return HANDLE(int(handle))
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
102 elif isinstance(handle, Handle):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
103 return HANDLE(handle.handle)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
104 elif isinstance(handle, HANDLE):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
105 return handle
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
106 else:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
107 raise TypeError('cannot convert %s to a handle' %
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
108 type(handle).__name__)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
109
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
110 __slots__ = 'handle'
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
111
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
112 def __init__(self, handle):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
113 if isinstance(handle, Integral):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
114 self.handle = handle
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
115 elif isinstance(handle, HANDLE):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
116 self.handle = handle.value
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
117 elif isinstance(handle, Handle):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
118 self.handle = handle.handle
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
119 elif isinstance(handle, _subprocess_handle):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
120 handle = HANDLE(int(handle))
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
121 flags = DWORD()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
122 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
123 if windll.kernel32.GetHandleInformation(handle, byref(flags)):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
124 flags = flags.value
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
125 else:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
126 flags = 0
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
127 except AttributeError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
128 # Available on NT 3.51 and up, NT line only
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
129 flags = 0
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
130 proc = HANDLE(int(GetCurrentProcess()))
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
131 handle = DuplicateHandle(proc, handle, proc, 0, flags & 1, 2)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
132 self.handle = handle.Detach()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
133 else:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
134 raise TypeError("Handle() argument must be a handle, not '%s'" %
81
24752db487c5 Fixed errors in the win32 module
Oleg Oshmyan <chortos@inbox.lv>
parents: 80
diff changeset
135 type(handle).__name__)
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
136
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
137 def __int__(self):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
138 return int(self.handle)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
139
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
140 def Detach(self):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
141 handle = self.handle
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
142 self.handle = None
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
143 return handle
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
144
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
145 # This is also __del__, so only locals are accessed
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
146 def Close(self, _CloseHandle=windll.kernel32.CloseHandle, _HANDLE=HANDLE):
131
7923faf392fe win32.Handle.__del__ no longer raises if __init__ gets wrong arguments
Oleg Oshmyan <chortos@inbox.lv>
parents: 128
diff changeset
147 if getattr(self, 'handle', None):
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
148 _CloseHandle(_HANDLE(self.handle))
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
149 self.handle = None
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
150 __del__ = Close
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
151
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
152 CHAR = c_char
226
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
153 CREATE_BREAKAWAY_FROM_JOB = 0x01000000
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
154 INVALID_HANDLE_VALUE = HANDLE(-1).value
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
155 LPDWORD = POINTER(DWORD)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
156 LPFILETIME = POINTER(FILETIME)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
157 SIZE_T = ULONG_PTR = WPARAM
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
158 ULONGLONG = c_ulonglong
148
aa343ff41c27 Attempted to work around unwarranted ERROR_ACCESS_DENIED on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
159 ERROR_ACCESS_DENIED = 5
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
160
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
161 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
162 unicode
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
163 except NameError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
164 LPCTSTR = LPCWSTR
81
24752db487c5 Fixed errors in the win32 module
Oleg Oshmyan <chortos@inbox.lv>
parents: 80
diff changeset
165 UNISUFFIX = 'W'
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
166 else:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
167 LPCTSTR = LPCSTR
81
24752db487c5 Fixed errors in the win32 module
Oleg Oshmyan <chortos@inbox.lv>
parents: 80
diff changeset
168 UNISUFFIX = 'A'
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
169
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
170
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
171 prototype = WINFUNCTYPE(BOOL, Handle,
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
172 LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
173 flags = ((1, 'process'),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
174 (2, 'creation'), (2, 'exit'), (2, 'kernel'), (2, 'user'))
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
175 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
176 GetProcessTimes = prototype(('GetProcessTimes', windll.kernel32), flags)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
177 except AttributeError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
178 # Available on NT 3.5 and up, NT line only
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
179 GetProcessTimes = None
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
180 else:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
181 def errcheck(result, func, args):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
182 if not result: raise WinError()
140
388ae061c915 The win32 module now trusts the wall-clock time reported by GetProcessTimes
Oleg Oshmyan <chortos@inbox.lv>
parents: 134
diff changeset
183 times = ((t.dwHighDateTime << 32 | t.dwLowDateTime) / 10000000
388ae061c915 The win32 module now trusts the wall-clock time reported by GetProcessTimes
Oleg Oshmyan <chortos@inbox.lv>
parents: 134
diff changeset
184 for t in args[1:])
388ae061c915 The win32 module now trusts the wall-clock time reported by GetProcessTimes
Oleg Oshmyan <chortos@inbox.lv>
parents: 134
diff changeset
185 return ProcessTimes(*times)
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
186 GetProcessTimes.errcheck = errcheck
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
187
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
188
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
189 class PROCESS_MEMORY_COUNTERS(Structure):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
190 _fields_ = (('cb', DWORD),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
191 ('PageFaultCount', DWORD),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
192 ('PeakWorkingSetSize', SIZE_T),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
193 ('WorkingSetSize', SIZE_T),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
194 ('QuotaPeakPagedPoolUsage', SIZE_T),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
195 ('QuotaPagedPoolUsage', SIZE_T),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
196 ('QuotaPeakNonPagedPoolUsage', SIZE_T),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
197 ('QuotaNonPagedPoolUsage', SIZE_T),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
198 ('PagefileUsage', SIZE_T),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
199 ('PeakPagefileUsage', SIZE_T))
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
200
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
201 prototype = WINFUNCTYPE(BOOL, Handle, POINTER(PROCESS_MEMORY_COUNTERS), DWORD)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
202 flags = ((1, 'process'), (2, 'counters'),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
203 (5, 'cb', sizeof(PROCESS_MEMORY_COUNTERS)))
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
204 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
205 GetProcessMemoryInfo = prototype(('GetProcessMemoryInfo', windll.psapi),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
206 flags)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
207 except AttributeError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
208 # Available on NT 4.0 and up, NT line only
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
209 GetProcessMemoryInfo = None
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
210 else:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
211 def errcheck(result, func, args):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
212 if not result: raise WinError()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
213 return args
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
214 GetProcessMemoryInfo.errcheck = errcheck
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
215
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
216
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
217 class _uChar_union(Union):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
218 _fields_ = (('UnicodeChar', WCHAR),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
219 ('AsciiChar', CHAR))
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
220
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
221 class KEY_EVENT_RECORD(Structure):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
222 _fields_ = (('bKeyDown', BOOL),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
223 ('wRepeatCount', WORD),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
224 ('wVirtualKeyCode', WORD),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
225 ('wVirtualScanCode', WORD),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
226 ('uChar', _uChar_union),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
227 ('dwControlKeyState', DWORD))
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
228
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
229 RIGHT_ALT_PRESSED = 0x001
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
230 LEFT_ALT_PRESSED = 0x002
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
231 RIGHT_CTRL_PRESSED = 0x004
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
232 LEFT_CTRL_PRESSED = 0x008
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
233 SHIFT_PRESSED = 0x010
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
234 NUMLOCK_ON = 0x020
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
235 SCROLLLOCK_ON = 0x040
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
236 CAPSLOCK_ON = 0x080
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
237 ENHANCED_KEY = 0x100
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
238
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
239 class _Event_union(Union):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
240 _fields_ = ('KeyEvent', KEY_EVENT_RECORD),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
241
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
242 class INPUT_RECORD(Structure):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
243 _fields_ = (('EventType', WORD),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
244 ('Event', _Event_union))
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
245
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
246 KEY_EVENT = 0x01
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
247 MOUSE_EVENT = 0x02
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
248 WINDOW_BUFFER_SIZE_EVENT = 0x04
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
249 MENU_EVENT = 0x08
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
250 FOCUS_EVENT = 0x10
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
251
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
252 prototype = WINFUNCTYPE(BOOL, Handle, POINTER(INPUT_RECORD), DWORD, LPDWORD)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
253 flags = (1, 'input'), (2, 'buffer'), (5, 'length', 1), (2, 'number_read')
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
254 ReadConsoleInput = prototype(('ReadConsoleInputA', windll.kernel32), flags)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
255 def errcheck(result, func, args):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
256 if not result: raise WinError()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
257 return args[1] if args[3] else None
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
258 ReadConsoleInput.errcheck = errcheck
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
259
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
260
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
261 prototype = WINFUNCTYPE(BOOL, Handle)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
262 flags = (1, 'input'),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
263 FlushConsoleInputBuffer = prototype(('FlushConsoleInputBuffer',
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
264 windll.kernel32), flags)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
265 def errcheck(result, func, args):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
266 if not result: raise WinError()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
267 FlushConsoleInputBuffer.errcheck = errcheck
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
268
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
269
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
270 prototype = WINFUNCTYPE(BOOL, Handle, DWORD)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
271 flags = (1, 'console'), (1, 'mode')
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
272 SetConsoleMode = prototype(('SetConsoleMode', windll.kernel32), flags)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
273 def errcheck(result, func, args):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
274 if not result: raise WinError()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
275 SetConsoleMode.errcheck = errcheck
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
276
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
277 ENABLE_PROCESSED_INPUT = 0x001
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
278 ENABLE_LINE_INPUT = 0x002
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
279 ENABLE_ECHO_INPUT = 0x004
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
280 ENABLE_WINDOW_INPUT = 0x008
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
281 ENABLE_MOUSE_INPUT = 0x010
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
282 ENABLE_INSERT_MODE = 0x020
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
283 ENABLE_QUICK_EDIT_MODE = 0x040
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
284 ENABLE_EXTENDED_FLAGS = 0x080
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
285
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
286 ENABLE_PROCESSED_OUTPUT = 1
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
287 ENABLE_WRAP_AT_EOL_OUTPUT = 2
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
288
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
289
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
290 prototype = WINFUNCTYPE(HANDLE, c_void_p, LPCTSTR)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
291 flags = (5, 'attributes'), (1, 'name')
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
292 try:
81
24752db487c5 Fixed errors in the win32 module
Oleg Oshmyan <chortos@inbox.lv>
parents: 80
diff changeset
293 CreateJobObject = prototype(('CreateJobObject'+UNISUFFIX, windll.kernel32),
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
294 flags)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
295 except AttributeError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
296 # Available on 2000 and up, NT line only
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
297 CreateJobObject = lambda name: None
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
298 else:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
299 def errcheck(result, func, args):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
300 if not result: raise WinError()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
301 return Handle(result)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
302 CreateJobObject.errcheck = errcheck
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
303
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
304
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
305 prototype = WINFUNCTYPE(BOOL, Handle, Handle)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
306 flags = (1, 'job'), (1, 'handle')
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
307 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
308 AssignProcessToJobObject = prototype(('AssignProcessToJobObject',
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
309 windll.kernel32), flags)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
310 except AttributeError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
311 # Available on 2000 and up, NT line only
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
312 AssignProcessToJobObject = lambda job, handle: None
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
313 else:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
314 def errcheck(result, func, args):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
315 if not result: raise WinError()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
316 AssignProcessToJobObject.errcheck = errcheck
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
317
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
318
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
319 class JOBOBJECT_BASIC_LIMIT_INFORMATION(Structure):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
320 _fields_ = (('PerProcessUserTimeLimit', LARGE_INTEGER),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
321 ('PerJobUserTimeLimit', LARGE_INTEGER),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
322 ('LimitFlags', DWORD),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
323 ('MinimumWorkingSetSize', SIZE_T),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
324 ('MaximumWorkingSetSize', SIZE_T),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
325 ('ActiveProcessLimit', DWORD),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
326 ('Affinity', ULONG_PTR),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
327 ('PriorityClass', DWORD),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
328 ('SchedulingClass', DWORD))
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
329
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
330 JOB_OBJECT_LIMIT_WORKINGSET = 0x0001
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
331 JOB_OBJECT_LIMIT_PROCESS_TIME = 0x0002
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
332 JOB_OBJECT_LIMIT_JOB_TIME = 0x0004
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
333 JOB_OBJECT_LIMIT_ACTIVE_PROCESS = 0x0008
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
334 JOB_OBJECT_LIMIT_AFFINITY = 0x0010
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
335 JOB_OBJECT_LIMIT_PRIORITY_CLASS = 0x0020
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
336 JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME = 0x0040
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
337 JOB_OBJECT_LIMIT_SCHEDULING_CLASS = 0x0080
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
338 JOB_OBJECT_LIMIT_PROCESS_MEMORY = 0x0100
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
339 JOB_OBJECT_LIMIT_JOB_MEMORY = 0x0200
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
340 JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION = 0x0400
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
341 JOB_OBJECT_LIMIT_BREAKAWAY_OK = 0x0800
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
342 JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK = 0x1000
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
343 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x2000
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
344 JOB_OBJECT_LIMIT_SUBSET_AFFINITY = 0x4000
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
345
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
346 class IO_COUNTERS(Structure):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
347 _fields_ = (('ReadOperationCount', ULONGLONG),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
348 ('WriteOperationCount', ULONGLONG),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
349 ('OtherOperationCount', ULONGLONG),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
350 ('ReadTransferCount', ULONGLONG),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
351 ('WriteTransferCount', ULONGLONG),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
352 ('OtherTransferCount', ULONGLONG))
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
353
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
354 class JOBOBJECT_EXTENDED_LIMIT_INFORMATION(Structure):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
355 _fields_ = (('BasicLimitInformation', JOBOBJECT_BASIC_LIMIT_INFORMATION),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
356 ('IoInfo', IO_COUNTERS),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
357 ('ProcessMemoryLimit', SIZE_T),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
358 ('JobMemoryLimit', SIZE_T),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
359 ('PeakProcessMemoryUsed', SIZE_T),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
360 ('PeakJobMemoryUsed', SIZE_T))
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
361
82
06356af50bf9 Finished testcases reorganization and CPU time limit implementation
Oleg Oshmyan <chortos@inbox.lv>
parents: 81
diff changeset
362 prototype = WINFUNCTYPE(BOOL, Handle, c_int, c_void_p, DWORD)
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
363 flags = (1, 'job'), (1, 'infoclass'), (1, 'info'), (1, 'infosize')
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
364 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
365 _setjobinfo = prototype(('SetInformationJobObject',windll.kernel32), flags)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
366 except AttributeError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
367 # Available on 2000 and up, NT line only
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
368 SetInformationJobObject = lambda job, infoclass, info: None
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
369 else:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
370 def errcheck(result, func, args):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
371 if not result: raise WinError()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
372 _setjobinfo.errcheck = errcheck
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
373 def SetInformationJobObject(job, infoclass, info):
82
06356af50bf9 Finished testcases reorganization and CPU time limit implementation
Oleg Oshmyan <chortos@inbox.lv>
parents: 81
diff changeset
374 return _setjobinfo(job, infoclass, byref(info), sizeof(info))
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
375
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
376 (
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
377 JobObjectBasicAccountingInformation,
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
378 JobObjectBasicLimitInformation,
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
379 JobObjectBasicProcessIdList,
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
380 JobObjectBasicUIRestrictions,
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
381 JobObjectSecurityLimitInformation,
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
382 JobObjectEndOfJobTimeInformation,
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
383 JobObjectAssociateCompletionPortInformation,
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
384 JobObjectBasicAndIoAccountingInformation,
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
385 JobObjectExtendedLimitInformation,
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
386 JobObjectJobSetInformation,
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
387 MaxJobObjectInfoClass
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
388 ) = range(1, 12)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
389
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
390
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
391 prototype = WINFUNCTYPE(DWORD, DWORD, POINTER(HANDLE), BOOL, DWORD)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
392 flags = (1, 'count'), (1, 'handles'), (1, 'wait_all'), (1, 'milliseconds')
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
393 _wait_multiple = prototype(('WaitForMultipleObjects', windll.kernel32), flags)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
394 def errcheck(result, func, args):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
395 if result == WAIT_FAILED: raise WinError()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
396 return args
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
397 _wait_multiple.errcheck = errcheck
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
398 def WaitForMultipleObjects(handles, wait_all, timeout):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
399 n = len(handles)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
400 handles = (Handle.from_param(handle) for handle in handles)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
401 timeout = ceil(timeout * 1000)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
402 return _wait_multiple(n, (HANDLE * n)(*handles), wait_all, timeout)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
403
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
404 # WAIT_OBJECT_0 defined at the top of the file
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
405 WAIT_ABANDONED_0 = 0x00000080
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
406 WAIT_TIMEOUT = 0x00000102
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
407 WAIT_FAILED = 0xFFFFFFFF
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
408
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
409
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
410 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
411 _wait_single = WaitForSingleObject
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
412 except NameError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
413 prototype = WINFUNCTYPE(DWORD, Handle, DWORD)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
414 flags = (1, 'handle'), (1, 'milliseconds')
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
415 _wait_single = prototype(('WaitForSingleObject', windll.kernel32), flags)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
416 def errcheck(result, func, args):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
417 if result == WAIT_FAILED: raise WinError()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
418 return args
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
419 _wait_single.errcheck = errcheck
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
420 def WaitForSingleObject(handle, timeout):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
421 return _wait_single(handle, ceil(timeout * 1000))
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
422
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
423
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
424 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
425 GetStdHandle
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
426 except NameError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
427 prototype = WINFUNCTYPE(HANDLE, DWORD)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
428 flags = (1, 'which'),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
429 GetStdHandle = prototype(('GetStdHandle', windll.kernel32), flags)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
430 def errcheck(result, func, args):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
431 if result == INVALID_HANDLE_VALUE: raise WinError()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
432 return args if result else None
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
433 GetStdHandle.errcheck = errcheck
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
434
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
435
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
436 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
437 TerminateProcess
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
438 except NameError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
439 prototype = WINFUNCTYPE(BOOL, Handle, UINT)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
440 flags = (1, 'process'), (1, 'exitcode')
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
441 TerminateProcess = prototype(('TerminateProcess', windll.kernel32), flags)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
442 def errcheck(result, func, args):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
443 if not result: raise WinError()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
444 TerminateProcess.errcheck = errcheck
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
445
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
446
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
447 # Do not show error messages due to errors in the program being tested
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
448 try:
81
24752db487c5 Fixed errors in the win32 module
Oleg Oshmyan <chortos@inbox.lv>
parents: 80
diff changeset
449 errmode = windll.kernel32.GetErrorMode()
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
450 except AttributeError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
451 # GetErrorMode is available on Vista/2008 and up
81
24752db487c5 Fixed errors in the win32 module
Oleg Oshmyan <chortos@inbox.lv>
parents: 80
diff changeset
452 errmode = windll.kernel32.SetErrorMode(0)
24752db487c5 Fixed errors in the win32 module
Oleg Oshmyan <chortos@inbox.lv>
parents: 80
diff changeset
453 windll.kernel32.SetErrorMode(errmode | 0x8003)
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
454
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
455 stdin = GetStdHandle(STD_INPUT_HANDLE)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
456 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
457 SetConsoleMode(stdin, ENABLE_PROCESSED_INPUT)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
458 except WindowsError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
459 console_input = False
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
460 else:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
461 console_input = True
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
462 FlushConsoleInputBuffer(stdin)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
463
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
464 def call(*args, **kwargs):
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
465 case = kwargs.pop('case')
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
466 job = CreateJobObject(None)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
467 flags = 0
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
468 if case.maxcputime:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
469 flags |= JOB_OBJECT_LIMIT_PROCESS_TIME
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
470 if case.maxmemory:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
471 flags |= JOB_OBJECT_LIMIT_PROCESS_MEMORY
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
472 limits = JOBOBJECT_EXTENDED_LIMIT_INFORMATION(
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
473 JOBOBJECT_BASIC_LIMIT_INFORMATION(
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
474 PerProcessUserTimeLimit=ceil((case.maxcputime or 0)*10000000),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
475 LimitFlags=flags,
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
476 ),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
477 ProcessMemoryLimit=ceil((case.maxmemory or 0)*1048576),
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
478 )
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
479 SetInformationJobObject(job, JobObjectExtendedLimitInformation, limits)
226
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
480 kwargs['creationflags'] = kwargs.get('creationflags', 0) | CREATE_BREAKAWAY_FROM_JOB
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
481 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
482 case.process = Popen(*args, **kwargs)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
483 except OSError:
146
d5b6708c1955 Distutils support, reorganization and cleaning up
Oleg Oshmyan <chortos@inbox.lv>
parents: 142
diff changeset
484 raise CannotStartTestee(sys.exc_info()[1])
157
5f9e6121161a Second attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 155
diff changeset
485 case.time_started = clock()
226
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
486 while True:
148
aa343ff41c27 Attempted to work around unwarranted ERROR_ACCESS_DENIED on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
487 try:
226
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
488 AssignProcessToJobObject(job, case.process._handle)
148
aa343ff41c27 Attempted to work around unwarranted ERROR_ACCESS_DENIED on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 146
diff changeset
489 except WindowsError:
226
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
490 e = sys.exc_info()[1]
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
491 try:
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
492 if case.process.poll() is not None:
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
493 break
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
494 except WindowsError:
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
495 e = sys.exc_info()[1]
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
496 if e.winerror != ERROR_ACCESS_DENIED:
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
497 raise CannotStartTestee(e)
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
498 time.sleep(0)
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
499 else:
ebb35960b5bc Third attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 157
diff changeset
500 break
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
501 if not console_input:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
502 if case.maxwalltime:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
503 if (WaitForSingleObject(case.process._handle, case.maxwalltime) !=
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
504 WAIT_OBJECT_0):
146
d5b6708c1955 Distutils support, reorganization and cleaning up
Oleg Oshmyan <chortos@inbox.lv>
parents: 142
diff changeset
505 raise WallTimeLimitExceeded
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
506 else:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
507 case.process.wait()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
508 else:
121
72c02b640dcf Escape presses simultaneous with the testee exiting no longer cancel on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 120
diff changeset
509 handles = case.process._handle, stdin
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
510 if case.maxwalltime:
142
98bccf81db4d win32.call() now trusts its own case.time_started
Oleg Oshmyan <chortos@inbox.lv>
parents: 141
diff changeset
511 time_end = case.time_started + case.maxwalltime
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
512 while case.process.poll() is None:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
513 remaining = time_end - clock()
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
514 if remaining > 0:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
515 if (WaitForMultipleObjects(handles, False, remaining) ==
121
72c02b640dcf Escape presses simultaneous with the testee exiting no longer cancel on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 120
diff changeset
516 WAIT_OBJECT_0 + 1):
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
517 ir = ReadConsoleInput(stdin)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
518 if (ir and
120
08a1d6cc5948 Named a magic number that had sneaked into win32.py
Oleg Oshmyan <chortos@inbox.lv>
parents: 117
diff changeset
519 ir.EventType == KEY_EVENT and
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
520 ir.Event.KeyEvent.bKeyDown and
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
521 ir.Event.KeyEvent.wVirtualKeyCode == 27):
146
d5b6708c1955 Distutils support, reorganization and cleaning up
Oleg Oshmyan <chortos@inbox.lv>
parents: 142
diff changeset
522 raise CanceledByUser
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
523 else:
146
d5b6708c1955 Distutils support, reorganization and cleaning up
Oleg Oshmyan <chortos@inbox.lv>
parents: 142
diff changeset
524 raise WallTimeLimitExceeded
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
525 else:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
526 while case.process.poll() is None:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
527 if (WaitForMultipleObjects(handles, False, INFINITE) ==
121
72c02b640dcf Escape presses simultaneous with the testee exiting no longer cancel on Win32
Oleg Oshmyan <chortos@inbox.lv>
parents: 120
diff changeset
528 WAIT_OBJECT_0 + 1):
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
529 ir = ReadConsoleInput(stdin)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
530 if (ir and
120
08a1d6cc5948 Named a magic number that had sneaked into win32.py
Oleg Oshmyan <chortos@inbox.lv>
parents: 117
diff changeset
531 ir.EventType == KEY_EVENT and
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
532 ir.Event.KeyEvent.bKeyDown and
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
533 ir.Event.KeyEvent.wVirtualKeyCode == 27):
146
d5b6708c1955 Distutils support, reorganization and cleaning up
Oleg Oshmyan <chortos@inbox.lv>
parents: 142
diff changeset
534 raise CanceledByUser
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
535 case.time_stopped = clock()
140
388ae061c915 The win32 module now trusts the wall-clock time reported by GetProcessTimes
Oleg Oshmyan <chortos@inbox.lv>
parents: 134
diff changeset
536 if GetProcessTimes:
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
537 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
538 times = GetProcessTimes(case.process._handle)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
539 except WindowsError:
251
d3a5d1929ad2 Wall-clock time limit is now enforced before handling CPU times on Win32 too
Oleg Oshmyan <chortos@inbox.lv>
parents: 250
diff changeset
540 times = None
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
541 else:
251
d3a5d1929ad2 Wall-clock time limit is now enforced before handling CPU times on Win32 too
Oleg Oshmyan <chortos@inbox.lv>
parents: 250
diff changeset
542 case.time_stopped = times.exit
d3a5d1929ad2 Wall-clock time limit is now enforced before handling CPU times on Win32 too
Oleg Oshmyan <chortos@inbox.lv>
parents: 250
diff changeset
543 case.time_started = times.creation
d3a5d1929ad2 Wall-clock time limit is now enforced before handling CPU times on Win32 too
Oleg Oshmyan <chortos@inbox.lv>
parents: 250
diff changeset
544 if (case.maxwalltime and
d3a5d1929ad2 Wall-clock time limit is now enforced before handling CPU times on Win32 too
Oleg Oshmyan <chortos@inbox.lv>
parents: 250
diff changeset
545 case.time_stopped - case.time_started > case.maxwalltime):
d3a5d1929ad2 Wall-clock time limit is now enforced before handling CPU times on Win32 too
Oleg Oshmyan <chortos@inbox.lv>
parents: 250
diff changeset
546 raise WallTimeLimitExceeded
d3a5d1929ad2 Wall-clock time limit is now enforced before handling CPU times on Win32 too
Oleg Oshmyan <chortos@inbox.lv>
parents: 250
diff changeset
547 if times and (case.maxcputime or not case.maxwalltime):
d3a5d1929ad2 Wall-clock time limit is now enforced before handling CPU times on Win32 too
Oleg Oshmyan <chortos@inbox.lv>
parents: 250
diff changeset
548 cputime = times.kernel + times.user
d3a5d1929ad2 Wall-clock time limit is now enforced before handling CPU times on Win32 too
Oleg Oshmyan <chortos@inbox.lv>
parents: 250
diff changeset
549 case.time_stopped = cputime
d3a5d1929ad2 Wall-clock time limit is now enforced before handling CPU times on Win32 too
Oleg Oshmyan <chortos@inbox.lv>
parents: 250
diff changeset
550 case.time_started = 0
d3a5d1929ad2 Wall-clock time limit is now enforced before handling CPU times on Win32 too
Oleg Oshmyan <chortos@inbox.lv>
parents: 250
diff changeset
551 case.time_limit_string = case.cpu_time_limit_string
d3a5d1929ad2 Wall-clock time limit is now enforced before handling CPU times on Win32 too
Oleg Oshmyan <chortos@inbox.lv>
parents: 250
diff changeset
552 if case.maxcputime and cputime > case.maxcputime:
d3a5d1929ad2 Wall-clock time limit is now enforced before handling CPU times on Win32 too
Oleg Oshmyan <chortos@inbox.lv>
parents: 250
diff changeset
553 raise CPUTimeLimitExceeded
82
06356af50bf9 Finished testcases reorganization and CPU time limit implementation
Oleg Oshmyan <chortos@inbox.lv>
parents: 81
diff changeset
554 if case.maxcputime and case.process.returncode == 1816:
146
d5b6708c1955 Distutils support, reorganization and cleaning up
Oleg Oshmyan <chortos@inbox.lv>
parents: 142
diff changeset
555 raise CPUTimeLimitExceeded
80
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
556 if case.maxmemory and GetProcessMemoryInfo:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
557 try:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
558 counters = GetProcessMemoryInfo(case.process._handle)
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
559 except WindowsError:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
560 pass
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
561 else:
809b77302b21 Win32-specific module with memory and CPU time limits
Oleg Oshmyan <chortos@inbox.lv>
parents:
diff changeset
562 if counters.PeakPagefileUsage > case.maxmemory * 1048576:
146
d5b6708c1955 Distutils support, reorganization and cleaning up
Oleg Oshmyan <chortos@inbox.lv>
parents: 142
diff changeset
563 raise MemoryLimitExceeded
82
06356af50bf9 Finished testcases reorganization and CPU time limit implementation
Oleg Oshmyan <chortos@inbox.lv>
parents: 81
diff changeset
564
06356af50bf9 Finished testcases reorganization and CPU time limit implementation
Oleg Oshmyan <chortos@inbox.lv>
parents: 81
diff changeset
565
06356af50bf9 Finished testcases reorganization and CPU time limit implementation
Oleg Oshmyan <chortos@inbox.lv>
parents: 81
diff changeset
566 def kill(process):
157
5f9e6121161a Second attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 155
diff changeset
567 # Give up after three attempts
5f9e6121161a Second attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 155
diff changeset
568 for i in range(3):
134
e84f33a60a5c Moved process killing logic into platform-specific modules
Oleg Oshmyan <chortos@inbox.lv>
parents: 131
diff changeset
569 try:
e84f33a60a5c Moved process killing logic into platform-specific modules
Oleg Oshmyan <chortos@inbox.lv>
parents: 131
diff changeset
570 try:
e84f33a60a5c Moved process killing logic into platform-specific modules
Oleg Oshmyan <chortos@inbox.lv>
parents: 131
diff changeset
571 process.terminate()
e84f33a60a5c Moved process killing logic into platform-specific modules
Oleg Oshmyan <chortos@inbox.lv>
parents: 131
diff changeset
572 except AttributeError:
e84f33a60a5c Moved process killing logic into platform-specific modules
Oleg Oshmyan <chortos@inbox.lv>
parents: 131
diff changeset
573 TerminateProcess(process._handle, 1)
e84f33a60a5c Moved process killing logic into platform-specific modules
Oleg Oshmyan <chortos@inbox.lv>
parents: 131
diff changeset
574 except WindowsError:
157
5f9e6121161a Second attempt to work around unwarranted ERROR_ACCESS_DENIED on Windows
Oleg Oshmyan <chortos@inbox.lv>
parents: 155
diff changeset
575 time.sleep(0)
134
e84f33a60a5c Moved process killing logic into platform-specific modules
Oleg Oshmyan <chortos@inbox.lv>
parents: 131
diff changeset
576 else:
e84f33a60a5c Moved process killing logic into platform-specific modules
Oleg Oshmyan <chortos@inbox.lv>
parents: 131
diff changeset
577 break