Mercurial > ~astiob > upreckon > hgweb
comparison win32.py @ 140:388ae061c915
The win32 module now trusts the wall-clock time reported by GetProcessTimes
author | Oleg Oshmyan <chortos@inbox.lv> |
---|---|
date | Tue, 24 May 2011 22:46:30 +0100 |
parents | e84f33a60a5c |
children | dfde0f5e0984 |
comparison
equal
deleted
inserted
replaced
139:2d465a8a679c | 140:388ae061c915 |
---|---|
39 from collections import namedtuple | 39 from collections import namedtuple |
40 except ImportError: | 40 except ImportError: |
41 from operator import itemgetter | 41 from operator import itemgetter |
42 class ProcessTimes(tuple): | 42 class ProcessTimes(tuple): |
43 __slots__ = () | 43 __slots__ = () |
44 __new__ = lambda cls, kernel, user: tuple.__new__(cls, (kernel, user)) | 44 def __new__(cls, creation, exit, kernel, user): |
45 return tuple.__new__(cls, (creation, exit, kernel, user)) | |
45 __getnewargs__ = lambda self: tuple(self) | 46 __getnewargs__ = lambda self: tuple(self) |
46 kernel, user = (property(itemgetter(i)) for i in (0, 1)) | 47 creation, exit, kernel, user = map(property, map(itemgetter, range(4))) |
47 else: | 48 else: |
48 ProcessTimes = namedtuple('ProcessTimes', 'kernel user') | 49 ProcessTimes = namedtuple('ProcessTimes', 'creation exit kernel user') |
49 | 50 |
50 __all__ = 'call', 'kill', 'pause', 'clock' | 51 __all__ = 'call', 'kill', 'pause', 'clock' |
51 | 52 |
52 | 53 |
53 from functools import wraps | 54 from functools import wraps |
175 # Available on NT 3.5 and up, NT line only | 176 # Available on NT 3.5 and up, NT line only |
176 GetProcessTimes = None | 177 GetProcessTimes = None |
177 else: | 178 else: |
178 def errcheck(result, func, args): | 179 def errcheck(result, func, args): |
179 if not result: raise WinError() | 180 if not result: raise WinError() |
180 ftimes = [t.dwHighDateTime << 32 | t.dwLowDateTime for t in args[3:]] | 181 times = ((t.dwHighDateTime << 32 | t.dwLowDateTime) / 10000000 |
181 kernel = ftimes[0] / 10000000 | 182 for t in args[1:]) |
182 user = ftimes[1] / 10000000 | 183 return ProcessTimes(*times) |
183 return ProcessTimes(kernel, user) | |
184 GetProcessTimes.errcheck = errcheck | 184 GetProcessTimes.errcheck = errcheck |
185 | 185 |
186 | 186 |
187 class PROCESS_MEMORY_COUNTERS(Structure): | 187 class PROCESS_MEMORY_COUNTERS(Structure): |
188 _fields_ = (('cb', DWORD), | 188 _fields_ = (('cb', DWORD), |
514 ir.EventType == KEY_EVENT and | 514 ir.EventType == KEY_EVENT and |
515 ir.Event.KeyEvent.bKeyDown and | 515 ir.Event.KeyEvent.bKeyDown and |
516 ir.Event.KeyEvent.wVirtualKeyCode == 27): | 516 ir.Event.KeyEvent.wVirtualKeyCode == 27): |
517 raise testcases.CanceledByUser | 517 raise testcases.CanceledByUser |
518 case.time_stopped = clock() | 518 case.time_stopped = clock() |
519 if GetProcessTimes and (case.maxcputime or not case.maxwalltime): | 519 if GetProcessTimes: |
520 try: | 520 try: |
521 times = GetProcessTimes(case.process._handle) | 521 times = GetProcessTimes(case.process._handle) |
522 except WindowsError: | 522 except WindowsError: |
523 pass | 523 pass |
524 else: | 524 else: |
525 time = times.kernel + times.user | 525 if case.maxcputime or not case.maxwalltime: |
526 case.time_stopped = time | 526 cputime = times.kernel + times.user |
527 case.time_started = 0 | 527 case.time_stopped = cputime |
528 case.time_limit_string = case.cpu_time_limit_string | 528 case.time_started = 0 |
529 if case.maxcputime and time > case.maxcputime: | 529 case.time_limit_string = case.cpu_time_limit_string |
530 raise testcases.CPUTimeLimitExceeded | 530 if case.maxcputime and cputime > case.maxcputime: |
531 raise testcases.CPUTimeLimitExceeded | |
532 else: | |
533 case.time_stopped = times.exit | |
534 case.time_started = times.creation | |
535 walltime = times.exit - times.creation | |
536 if case.maxwalltime and walltime > case.maxwalltime: | |
537 raise testcases.WallTimeLimitExceeded | |
531 if case.maxcputime and case.process.returncode == 1816: | 538 if case.maxcputime and case.process.returncode == 1816: |
532 raise testcases.CPUTimeLimitExceeded | 539 raise testcases.CPUTimeLimitExceeded |
533 if case.maxmemory and GetProcessMemoryInfo: | 540 if case.maxmemory and GetProcessMemoryInfo: |
534 try: | 541 try: |
535 counters = GetProcessMemoryInfo(case.process._handle) | 542 counters = GetProcessMemoryInfo(case.process._handle) |