Mercurial > ~astiob > upreckon > hgweb
annotate win32.py @ 90:1fb319ec33af
Skimming mode added (-k/--skim option)
In skimming mode, as soon as a single test case within a test group
is failed, the remaining test cases in the same group are skipped.
Bug fix and simply a bit of refactoring: TestCase.has_iofiles and
TestCase.has_ansfile are now defined (the meaning should be clear
from the names).
| author | Oleg Oshmyan <chortos@inbox.lv> | 
|---|---|
| date | Mon, 28 Feb 2011 15:32:22 +0000 | 
| parents | 741ae3391b61 | 
| children | c62c9bfd614a | 
| rev | line source | 
|---|---|
| 
82
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
1 # Copyright (c) 2010-2011 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 | 
| 
82
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
4 import sys | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
5 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
6 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
7 from compat import * | 
| 
82
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
8 import testcases # mutual import | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
9 except ImportError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
10 import __main__ | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
11 __main__.import_error(sys.exc_info()[1]) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
12 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
13 from ctypes import * | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
14 from ctypes.wintypes import * | 
| 
82
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
15 from msvcrt import getch as pause | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
16 from subprocess import Popen | 
| 
85
 
741ae3391b61
Moved clock/time detection into platform-specific modules and testcases
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
82 
diff
changeset
 | 
17 | 
| 
 
741ae3391b61
Moved clock/time detection into platform-specific modules and testcases
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
82 
diff
changeset
 | 
18 try: | 
| 
 
741ae3391b61
Moved clock/time detection into platform-specific modules and testcases
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
82 
diff
changeset
 | 
19 from testcases import clock | 
| 
 
741ae3391b61
Moved clock/time detection into platform-specific modules and testcases
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
82 
diff
changeset
 | 
20 except ImportError: | 
| 
 
741ae3391b61
Moved clock/time detection into platform-specific modules and testcases
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
82 
diff
changeset
 | 
21 from time import clock | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
22 | 
| 
 
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__ = () | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
44 __new__ = lambda cls, kernel, user: tuple.__new__(cls, (kernel, user)) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
45 __getnewargs__ = lambda self: tuple(self) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
46 kernel, user = (property(itemgetter(i)) for i in (0, 1)) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
47 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
48 ProcessTimes = namedtuple('ProcessTimes', 'kernel user') | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
49 | 
| 
85
 
741ae3391b61
Moved clock/time detection into platform-specific modules and testcases
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
82 
diff
changeset
 | 
50 __all__ = 'call', 'kill', 'terminate', 'pause', 'clock' | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
51 | 
| 
 
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 # Automatically convert _subprocess handle objects into low-level HANDLEs | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
54 # and replicate their functionality for our own use | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
55 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
56 _subprocess_handle = type(GetCurrentProcess()) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
57 except NameError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
58 _subprocess_handle = Integral | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
59 class Handle(object): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
60 @staticmethod | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
61 def from_param(handle): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
62 if isinstance(handle, (_subprocess_handle, Integral)): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
63 return HANDLE(int(handle)) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
64 elif isinstance(handle, Handle): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
65 return HANDLE(handle.handle) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
66 elif isinstance(handle, HANDLE): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
67 return handle | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
68 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
69 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
 | 
70 type(handle).__name__) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
71 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
72 __slots__ = 'handle' | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
73 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
74 def __init__(self, handle): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
75 if isinstance(handle, Integral): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
76 self.handle = handle | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
77 elif isinstance(handle, HANDLE): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
78 self.handle = handle.value | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
79 elif isinstance(handle, Handle): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
80 self.handle = handle.handle | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
81 elif isinstance(handle, _subprocess_handle): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
82 handle = HANDLE(int(handle)) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
83 flags = DWORD() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
84 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
85 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
 | 
86 flags = flags.value | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
87 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
88 flags = 0 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
89 except AttributeError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
90 # 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
 | 
91 flags = 0 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
92 proc = HANDLE(int(GetCurrentProcess())) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
93 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
 | 
94 self.handle = handle.Detach() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
95 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
96 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
 | 
97 type(handle).__name__) | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
98 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
99 def __int__(self): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
100 return int(self.handle) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
101 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
102 def Detach(self): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
103 handle = self.handle | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
104 self.handle = None | 
| 
 
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 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
107 # 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
 | 
108 def Close(self, _CloseHandle=windll.kernel32.CloseHandle, _HANDLE=HANDLE): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
109 if self.handle: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
110 _CloseHandle(_HANDLE(self.handle)) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
111 self.handle = None | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
112 __del__ = Close | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
113 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
114 CHAR = c_char | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
115 INVALID_HANDLE_VALUE = HANDLE(-1).value | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
116 LPDWORD = POINTER(DWORD) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
117 LPFILETIME = POINTER(FILETIME) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
118 SIZE_T = ULONG_PTR = WPARAM | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
119 ULONGLONG = c_ulonglong | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
120 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
121 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
122 unicode | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
123 except NameError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
124 LPCTSTR = LPCWSTR | 
| 
81
 
24752db487c5
Fixed errors in the win32 module
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
80 
diff
changeset
 | 
125 UNISUFFIX = 'W' | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
126 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
127 LPCTSTR = LPCSTR | 
| 
81
 
24752db487c5
Fixed errors in the win32 module
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
80 
diff
changeset
 | 
128 UNISUFFIX = 'A' | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
129 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
130 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
131 prototype = WINFUNCTYPE(BOOL, Handle, | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
132 LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
133 flags = ((1, 'process'), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
134 (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
 | 
135 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
136 GetProcessTimes = prototype(('GetProcessTimes', windll.kernel32), flags) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
137 except AttributeError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
138 # 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
 | 
139 GetProcessTimes = None | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
140 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
141 def errcheck(result, func, args): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
142 if not result: raise WinError() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
143 ftimes = [t.dwHighDateTime << 32 | t.dwLowDateTime for t in args[3:]] | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
144 kernel = ftimes[0] / 10000000 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
145 user = ftimes[1] / 10000000 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
146 return ProcessTimes(kernel, user) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
147 GetProcessTimes.errcheck = errcheck | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
148 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
149 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
150 class PROCESS_MEMORY_COUNTERS(Structure): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
151 _fields_ = (('cb', DWORD), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
152 ('PageFaultCount', DWORD), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
153 ('PeakWorkingSetSize', SIZE_T), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
154 ('WorkingSetSize', SIZE_T), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
155 ('QuotaPeakPagedPoolUsage', SIZE_T), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
156 ('QuotaPagedPoolUsage', SIZE_T), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
157 ('QuotaPeakNonPagedPoolUsage', SIZE_T), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
158 ('QuotaNonPagedPoolUsage', SIZE_T), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
159 ('PagefileUsage', SIZE_T), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
160 ('PeakPagefileUsage', SIZE_T)) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
161 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
162 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
 | 
163 flags = ((1, 'process'), (2, 'counters'), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
164 (5, 'cb', sizeof(PROCESS_MEMORY_COUNTERS))) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
165 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
166 GetProcessMemoryInfo = prototype(('GetProcessMemoryInfo', windll.psapi), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
167 flags) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
168 except AttributeError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
169 # 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
 | 
170 GetProcessMemoryInfo = None | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
171 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
172 def errcheck(result, func, args): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
173 if not result: raise WinError() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
174 return args | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
175 GetProcessMemoryInfo.errcheck = errcheck | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
176 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
177 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
178 class _uChar_union(Union): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
179 _fields_ = (('UnicodeChar', WCHAR), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
180 ('AsciiChar', CHAR)) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
181 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
182 class KEY_EVENT_RECORD(Structure): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
183 _fields_ = (('bKeyDown', BOOL), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
184 ('wRepeatCount', WORD), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
185 ('wVirtualKeyCode', WORD), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
186 ('wVirtualScanCode', WORD), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
187 ('uChar', _uChar_union), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
188 ('dwControlKeyState', DWORD)) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
189 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
190 RIGHT_ALT_PRESSED = 0x001 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
191 LEFT_ALT_PRESSED = 0x002 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
192 RIGHT_CTRL_PRESSED = 0x004 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
193 LEFT_CTRL_PRESSED = 0x008 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
194 SHIFT_PRESSED = 0x010 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
195 NUMLOCK_ON = 0x020 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
196 SCROLLLOCK_ON = 0x040 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
197 CAPSLOCK_ON = 0x080 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
198 ENHANCED_KEY = 0x100 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
199 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
200 class _Event_union(Union): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
201 _fields_ = ('KeyEvent', KEY_EVENT_RECORD), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
202 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
203 class INPUT_RECORD(Structure): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
204 _fields_ = (('EventType', WORD), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
205 ('Event', _Event_union)) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
206 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
207 KEY_EVENT = 0x01 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
208 MOUSE_EVENT = 0x02 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
209 WINDOW_BUFFER_SIZE_EVENT = 0x04 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
210 MENU_EVENT = 0x08 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
211 FOCUS_EVENT = 0x10 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
212 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
213 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
 | 
214 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
 | 
215 ReadConsoleInput = prototype(('ReadConsoleInputA', windll.kernel32), flags) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
216 def errcheck(result, func, args): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
217 if not result: raise WinError() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
218 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
 | 
219 ReadConsoleInput.errcheck = errcheck | 
| 
 
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 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
222 prototype = WINFUNCTYPE(BOOL, Handle) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
223 flags = (1, 'input'), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
224 FlushConsoleInputBuffer = prototype(('FlushConsoleInputBuffer', | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
225 windll.kernel32), flags) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
226 def errcheck(result, func, args): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
227 if not result: raise WinError() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
228 FlushConsoleInputBuffer.errcheck = errcheck | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
229 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
230 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
231 prototype = WINFUNCTYPE(BOOL, Handle, DWORD) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
232 flags = (1, 'console'), (1, 'mode') | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
233 SetConsoleMode = prototype(('SetConsoleMode', windll.kernel32), flags) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
234 def errcheck(result, func, args): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
235 if not result: raise WinError() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
236 SetConsoleMode.errcheck = errcheck | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
237 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
238 ENABLE_PROCESSED_INPUT = 0x001 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
239 ENABLE_LINE_INPUT = 0x002 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
240 ENABLE_ECHO_INPUT = 0x004 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
241 ENABLE_WINDOW_INPUT = 0x008 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
242 ENABLE_MOUSE_INPUT = 0x010 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
243 ENABLE_INSERT_MODE = 0x020 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
244 ENABLE_QUICK_EDIT_MODE = 0x040 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
245 ENABLE_EXTENDED_FLAGS = 0x080 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
246 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
247 ENABLE_PROCESSED_OUTPUT = 1 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
248 ENABLE_WRAP_AT_EOL_OUTPUT = 2 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
249 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
250 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
251 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
 | 
252 flags = (5, 'attributes'), (1, 'name') | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
253 try: | 
| 
81
 
24752db487c5
Fixed errors in the win32 module
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
80 
diff
changeset
 | 
254 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
 | 
255 flags) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
256 except AttributeError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
257 # 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
 | 
258 CreateJobObject = lambda name: None | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
259 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
260 def errcheck(result, func, args): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
261 if not result: raise WinError() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
262 return Handle(result) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
263 CreateJobObject.errcheck = errcheck | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
264 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
265 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
266 prototype = WINFUNCTYPE(BOOL, Handle, Handle) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
267 flags = (1, 'job'), (1, 'handle') | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
268 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
269 AssignProcessToJobObject = prototype(('AssignProcessToJobObject', | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
270 windll.kernel32), flags) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
271 except AttributeError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
272 # 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
 | 
273 AssignProcessToJobObject = lambda job, handle: None | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
274 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
275 def errcheck(result, func, args): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
276 if not result: raise WinError() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
277 AssignProcessToJobObject.errcheck = errcheck | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
278 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
279 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
280 class JOBOBJECT_BASIC_LIMIT_INFORMATION(Structure): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
281 _fields_ = (('PerProcessUserTimeLimit', LARGE_INTEGER), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
282 ('PerJobUserTimeLimit', LARGE_INTEGER), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
283 ('LimitFlags', DWORD), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
284 ('MinimumWorkingSetSize', SIZE_T), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
285 ('MaximumWorkingSetSize', SIZE_T), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
286 ('ActiveProcessLimit', DWORD), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
287 ('Affinity', ULONG_PTR), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
288 ('PriorityClass', DWORD), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
289 ('SchedulingClass', DWORD)) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
290 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
291 JOB_OBJECT_LIMIT_WORKINGSET = 0x0001 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
292 JOB_OBJECT_LIMIT_PROCESS_TIME = 0x0002 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
293 JOB_OBJECT_LIMIT_JOB_TIME = 0x0004 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
294 JOB_OBJECT_LIMIT_ACTIVE_PROCESS = 0x0008 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
295 JOB_OBJECT_LIMIT_AFFINITY = 0x0010 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
296 JOB_OBJECT_LIMIT_PRIORITY_CLASS = 0x0020 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
297 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
 | 
298 JOB_OBJECT_LIMIT_SCHEDULING_CLASS = 0x0080 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
299 JOB_OBJECT_LIMIT_PROCESS_MEMORY = 0x0100 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
300 JOB_OBJECT_LIMIT_JOB_MEMORY = 0x0200 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
301 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
 | 
302 JOB_OBJECT_LIMIT_BREAKAWAY_OK = 0x0800 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
303 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
 | 
304 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
 | 
305 JOB_OBJECT_LIMIT_SUBSET_AFFINITY = 0x4000 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
306 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
307 class IO_COUNTERS(Structure): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
308 _fields_ = (('ReadOperationCount', ULONGLONG), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
309 ('WriteOperationCount', ULONGLONG), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
310 ('OtherOperationCount', ULONGLONG), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
311 ('ReadTransferCount', ULONGLONG), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
312 ('WriteTransferCount', ULONGLONG), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
313 ('OtherTransferCount', ULONGLONG)) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
314 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
315 class JOBOBJECT_EXTENDED_LIMIT_INFORMATION(Structure): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
316 _fields_ = (('BasicLimitInformation', JOBOBJECT_BASIC_LIMIT_INFORMATION), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
317 ('IoInfo', IO_COUNTERS), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
318 ('ProcessMemoryLimit', SIZE_T), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
319 ('JobMemoryLimit', SIZE_T), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
320 ('PeakProcessMemoryUsed', SIZE_T), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
321 ('PeakJobMemoryUsed', SIZE_T)) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
322 | 
| 
82
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
323 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
 | 
324 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
 | 
325 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
326 _setjobinfo = prototype(('SetInformationJobObject',windll.kernel32), flags) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
327 except AttributeError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
328 # 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
 | 
329 SetInformationJobObject = lambda job, infoclass, info: None | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
330 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
331 def errcheck(result, func, args): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
332 if not result: raise WinError() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
333 _setjobinfo.errcheck = errcheck | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
334 def SetInformationJobObject(job, infoclass, info): | 
| 
82
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
335 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
 | 
336 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
337 ( | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
338 JobObjectBasicAccountingInformation, | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
339 JobObjectBasicLimitInformation, | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
340 JobObjectBasicProcessIdList, | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
341 JobObjectBasicUIRestrictions, | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
342 JobObjectSecurityLimitInformation, | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
343 JobObjectEndOfJobTimeInformation, | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
344 JobObjectAssociateCompletionPortInformation, | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
345 JobObjectBasicAndIoAccountingInformation, | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
346 JobObjectExtendedLimitInformation, | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
347 JobObjectJobSetInformation, | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
348 MaxJobObjectInfoClass | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
349 ) = range(1, 12) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
350 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
351 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
352 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
 | 
353 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
 | 
354 _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
 | 
355 def errcheck(result, func, args): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
356 if result == WAIT_FAILED: raise WinError() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
357 return args | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
358 _wait_multiple.errcheck = errcheck | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
359 def WaitForMultipleObjects(handles, wait_all, timeout): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
360 n = len(handles) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
361 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
 | 
362 timeout = ceil(timeout * 1000) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
363 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
 | 
364 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
365 # 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
 | 
366 WAIT_ABANDONED_0 = 0x00000080 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
367 WAIT_TIMEOUT = 0x00000102 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
368 WAIT_FAILED = 0xFFFFFFFF | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
369 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
370 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
371 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
372 _wait_single = WaitForSingleObject | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
373 except NameError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
374 prototype = WINFUNCTYPE(DWORD, Handle, DWORD) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
375 flags = (1, 'handle'), (1, 'milliseconds') | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
376 _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
 | 
377 def errcheck(result, func, args): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
378 if result == WAIT_FAILED: raise WinError() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
379 return args | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
380 _wait_single.errcheck = errcheck | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
381 def WaitForSingleObject(handle, timeout): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
382 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
 | 
383 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
384 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
385 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
386 GetStdHandle | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
387 except NameError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
388 prototype = WINFUNCTYPE(HANDLE, DWORD) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
389 flags = (1, 'which'), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
390 GetStdHandle = prototype(('GetStdHandle', windll.kernel32), flags) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
391 def errcheck(result, func, args): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
392 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
 | 
393 return args if result else None | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
394 GetStdHandle.errcheck = errcheck | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
395 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
396 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
397 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
398 TerminateProcess | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
399 except NameError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
400 prototype = WINFUNCTYPE(BOOL, Handle, UINT) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
401 flags = (1, 'process'), (1, 'exitcode') | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
402 TerminateProcess = prototype(('TerminateProcess', windll.kernel32), flags) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
403 def errcheck(result, func, args): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
404 if not result: raise WinError() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
405 TerminateProcess.errcheck = errcheck | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
406 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
407 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
408 # 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
 | 
409 try: | 
| 
81
 
24752db487c5
Fixed errors in the win32 module
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
80 
diff
changeset
 | 
410 errmode = windll.kernel32.GetErrorMode() | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
411 except AttributeError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
412 # 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
 | 
413 errmode = windll.kernel32.SetErrorMode(0) | 
| 
 
24752db487c5
Fixed errors in the win32 module
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
80 
diff
changeset
 | 
414 windll.kernel32.SetErrorMode(errmode | 0x8003) | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
415 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
416 stdin = GetStdHandle(STD_INPUT_HANDLE) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
417 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
418 SetConsoleMode(stdin, ENABLE_PROCESSED_INPUT) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
419 except WindowsError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
420 console_input = False | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
421 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
422 console_input = True | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
423 FlushConsoleInputBuffer(stdin) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
424 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
425 def call(*args, **kwargs): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
426 case = kwargs.pop('case') | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
427 job = CreateJobObject(None) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
428 flags = 0 | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
429 if case.maxcputime: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
430 flags |= JOB_OBJECT_LIMIT_PROCESS_TIME | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
431 if case.maxmemory: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
432 flags |= JOB_OBJECT_LIMIT_PROCESS_MEMORY | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
433 limits = JOBOBJECT_EXTENDED_LIMIT_INFORMATION( | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
434 JOBOBJECT_BASIC_LIMIT_INFORMATION( | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
435 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
 | 
436 LimitFlags=flags, | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
437 ), | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
438 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
 | 
439 ) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
440 SetInformationJobObject(job, JobObjectExtendedLimitInformation, limits) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
441 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
442 case.process = Popen(*args, **kwargs) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
443 except OSError: | 
| 
82
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
444 raise testcases.CannotStartTestee(sys.exc_info()[1]) | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
445 case.time_started = clock() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
446 AssignProcessToJobObject(job, case.process._handle) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
447 if not console_input: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
448 if case.maxwalltime: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
449 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
 | 
450 WAIT_OBJECT_0): | 
| 
82
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
451 raise testcases.WallTimeLimitExceeded | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
452 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
453 case.process.wait() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
454 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
455 handles = stdin, case.process._handle | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
456 if case.maxwalltime: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
457 time_end = clock() + case.maxwalltime | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
458 while case.process.poll() is None: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
459 remaining = time_end - clock() | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
460 if remaining > 0: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
461 if (WaitForMultipleObjects(handles, False, remaining) == | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
462 WAIT_OBJECT_0): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
463 ir = ReadConsoleInput(stdin) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
464 if (ir and | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
465 ir.EventType == 1 and | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
466 ir.Event.KeyEvent.bKeyDown and | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
467 ir.Event.KeyEvent.wVirtualKeyCode == 27): | 
| 
82
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
468 raise testcases.CanceledByUser | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
469 else: | 
| 
82
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
470 raise testcases.WallTimeLimitExceeded | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
471 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
472 while case.process.poll() is None: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
473 if (WaitForMultipleObjects(handles, False, INFINITE) == | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
474 WAIT_OBJECT_0): | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
475 ir = ReadConsoleInput(stdin) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
476 if (ir and | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
477 ir.EventType == 1 and | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
478 ir.Event.KeyEvent.bKeyDown and | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
479 ir.Event.KeyEvent.wVirtualKeyCode == 27): | 
| 
82
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
480 raise testcases.CanceledByUser | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
481 case.time_stopped = clock() | 
| 
82
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
482 if GetProcessTimes: | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
483 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
484 times = GetProcessTimes(case.process._handle) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
485 except WindowsError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
486 pass | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
487 else: | 
| 
82
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
488 time = times.kernel + times.user | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
489 case.time_stopped = time | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
490 case.time_started = 0 | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
491 case.time_limit_string = case.cpu_time_limit_string | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
492 if case.maxcputime and time > case.maxcputime: | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
493 raise testcases.CPUTimeLimitExceeded | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
494 if case.maxcputime and case.process.returncode == 1816: | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
495 raise testcases.CPUTimeLimitExceeded | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
496 if case.maxmemory and case.process.returncode == -0x3ffffffb: | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
497 raise testcases.MemoryLimitExceeded | 
| 
80
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
498 if case.maxmemory and GetProcessMemoryInfo: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
499 try: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
500 counters = GetProcessMemoryInfo(case.process._handle) | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
501 except WindowsError: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
502 pass | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
503 else: | 
| 
 
809b77302b21
Win32-specific module with memory and CPU time limits
 
Oleg Oshmyan <chortos@inbox.lv> 
parents:  
diff
changeset
 | 
504 if counters.PeakPagefileUsage > case.maxmemory * 1048576: | 
| 
82
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
505 raise testcases.MemoryLimitExceeded | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
506 | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
507 | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
508 def kill(process): | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
509 try: | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
510 process.terminate() | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
511 except AttributeError: | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
512 TerminateProcess(process._handle) | 
| 
 
06356af50bf9
Finished testcases reorganization and CPU time limit implementation
 
Oleg Oshmyan <chortos@inbox.lv> 
parents: 
81 
diff
changeset
 | 
513 terminate = kill | 
