import lit.Test
+def abort_now():
+ """Abort the current process without doing any exception teardown"""
+ sys.stdout.flush()
+ if win32api:
+ win32api.TerminateProcess(win32api.GetCurrentProcess(), 3)
+ else:
+ os.kill(0, 9)
+
###
# Test Execution Implementation
# This is a sad hack. Unfortunately subprocess goes
# bonkers with ctrl-c and we start forking merrily.
print('\nCtrl-C detected, goodbye.')
- sys.stdout.flush()
- os.kill(0,9)
+ abort_now()
self.consumer.update(test_index, test)
class ThreadResultsConsumer(object):
print('\nCtrl-C detected, terminating.')
pool.terminate()
pool.join()
- os.kill(0,9)
+ abort_now()
return True
win32api.SetConsoleCtrlHandler(console_ctrl_handler, True)
deadline = time.time() + max_time
# Start a process pool. Copy over the data shared between all test runs.
+ # FIXME: Find a way to capture the worker process stderr. If the user
+ # interrupts the workers before we make it into our task callback, they
+ # will each raise a KeyboardInterrupt exception and print to stderr at
+ # the same time.
pool = multiprocessing.Pool(jobs, worker_initializer,
(self.lit_config,
self.parallelism_semaphores))
args=(test_index, test),
callback=self.consume_test_result)
for test_index, test in enumerate(self.tests)]
+ pool.close()
# Wait for all results to come in. The callback that runs in the
# parent process will update the display.
a.get() # Exceptions raised here come from the worker.
if self.hit_max_failures:
break
- finally:
+ except:
# Stop the workers and wait for any straggling results to come in
# if we exited without waiting on every async result.
pool.terminate()
+ raise
+ finally:
pool.join()
# Mark any tests that weren't run as UNRESOLVED.
execute_test(test, child_lit_config, child_parallelism_semaphores)
return (test_index, test)
except KeyboardInterrupt as e:
- # This is a sad hack. Unfortunately subprocess goes
- # bonkers with ctrl-c and we start forking merrily.
- print('\nCtrl-C detected, goodbye.')
- traceback.print_exc()
- sys.stdout.flush()
- os.kill(0,9)
+ # If a worker process gets an interrupt, abort it immediately.
+ abort_now()
except:
traceback.print_exc()