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