comparison testcases.py @ 63:fb9d0223a871

Fixed negative run times reported on POSIX
author Oleg Oshmyan <chortos@inbox.lv>
date Wed, 22 Dec 2010 18:56:25 +0200
parents 593ad09cd69b
children fcb5ab97f08e
comparison
equal deleted inserted replaced
62:593ad09cd69b 63:fb9d0223a871
90 90
91 try: 91 try:
92 from signal import SIGCHLD, signal, SIG_DFL 92 from signal import SIGCHLD, signal, SIG_DFL
93 from select import select, error as select_error 93 from select import select, error as select_error
94 from errno import EINTR 94 from errno import EINTR
95 import pickle
95 except ImportError: 96 except ImportError:
96 try: 97 try:
97 from _subprocess import WAIT_OBJECT_0, STD_INPUT_HANDLE, INFINITE 98 from _subprocess import WAIT_OBJECT_0, STD_INPUT_HANDLE, INFINITE
98 except ImportError: 99 except ImportError:
99 WAIT_OBJECT_0 = 0 100 WAIT_OBJECT_0 = 0
182 signal(SIGCHLD, bury_child) 183 signal(SIGCHLD, bury_child)
183 184
184 # If you want this to work, don't set any stdio argument to PIPE 185 # If you want this to work, don't set any stdio argument to PIPE
185 def call_real(*args, **kwargs): 186 def call_real(*args, **kwargs):
186 bury_child.case = case = kwargs.pop('case') 187 bury_child.case = case = kwargs.pop('case')
188 preexec_fn_ = kwargs.get('preexec_fn', None)
189 read, write = os.pipe()
190 def preexec_fn():
191 os.close(read)
192 if preexec_fn_:
193 preexec_fn_()
194 os.write(write, pickle.dumps(clock(), 1))
195 kwargs['preexec_fn'] = preexec_fn
187 try: 196 try:
188 case.process = Popen(*args, **kwargs) 197 case.process = Popen(*args, **kwargs)
189 except OSError: 198 except OSError:
199 os.close(read)
190 raise CannotStartTestee(sys.exc_info()[1]) 200 raise CannotStartTestee(sys.exc_info()[1])
191 case.time_started = clock() 201 finally:
192 if pause is None: 202 os.close(write)
193 if case.maxtime: 203 try:
194 time.sleep(case.maxtime) 204 if pause is None:
195 if case.process.poll() is None: 205 if case.maxtime:
196 raise TimeLimitExceeded 206 time.sleep(case.maxtime)
207 if case.process.poll() is None:
208 raise TimeLimitExceeded
209 else:
210 case.process.wait()
197 else: 211 else:
198 case.process.wait() 212 if not case.maxtime:
199 else: 213 try:
200 if not case.maxtime: 214 while case.process.poll() is None:
201 try: 215 if select((sys.stdin,), (), ())[0]:
202 while case.process.poll() is None:
203 if select((sys.stdin,), (), ())[0]:
204 if sys.stdin.read(1) == '\33':
205 raise CanceledByUser
206 except select_error:
207 if sys.exc_info()[1].args[0] != EINTR:
208 raise
209 else:
210 case.process.poll()
211 else:
212 time_end = clock() + case.maxtime
213 try:
214 while case.process.poll() is None:
215 remaining = time_end - clock()
216 if remaining > 0:
217 if select((sys.stdin,), (), (), remaining)[0]:
218 if sys.stdin.read(1) == '\33': 216 if sys.stdin.read(1) == '\33':
219 raise CanceledByUser 217 raise CanceledByUser
218 except select_error:
219 if sys.exc_info()[1].args[0] != EINTR:
220 raise
220 else: 221 else:
221 raise TimeLimitExceeded 222 case.process.poll()
222 except select_error: 223 else:
223 if sys.exc_info()[1].args[0] != EINTR: 224 time_end = clock() + case.maxtime
224 raise 225 try:
225 else: 226 while case.process.poll() is None:
226 case.process.poll() 227 remaining = time_end - clock()
227 del bury_child.case 228 if remaining > 0:
229 if select((sys.stdin,), (), (), remaining)[0]:
230 if sys.stdin.read(1) == '\33':
231 raise CanceledByUser
232 else:
233 raise TimeLimitExceeded
234 except select_error:
235 if sys.exc_info()[1].args[0] != EINTR:
236 raise
237 else:
238 case.process.poll()
239 finally:
240 case.time_started = pickle.loads(os.read(read, 512))
241 os.close(read)
242 del bury_child.case
228 def call(*args, **kwargs): 243 def call(*args, **kwargs):
229 if 'preexec_fn' in kwargs: 244 if 'preexec_fn' in kwargs:
230 try: 245 try:
231 return call_real(*args, **kwargs) 246 return call_real(*args, **kwargs)
232 except MemoryError: 247 except MemoryError: