Skip to content
Snippets Groups Projects
Commit b21ebec2 authored by Nico Rieck's avatar Nico Rieck
Browse files

lit: Support cancellation on Windows

The current machinery using KeyboardInterrupt for canceling doesn't work
with multiple threads on Windows as it just cancels the currently run tests
but the runners continue.

We install a handler for Ctrl-C which stops the provider from providing any
more tests to the runners. Together with aborting all currently running
tests, this brings lit to a halt.

llvm-svn: 186695
parent 4652d893
No related branches found
No related tags found
No related merge requests found
...@@ -76,6 +76,12 @@ class TestProvider: ...@@ -76,6 +76,12 @@ class TestProvider:
self.iter = iter(tests) self.iter = iter(tests)
self.lock = threading.Lock() self.lock = threading.Lock()
self.startTime = time.time() self.startTime = time.time()
self.canceled = False
def cancel(self):
self.lock.acquire()
self.canceled = True
self.lock.release()
def get(self): def get(self):
# Check if we have run out of time. # Check if we have run out of time.
...@@ -85,6 +91,10 @@ class TestProvider: ...@@ -85,6 +91,10 @@ class TestProvider:
# Otherwise take the next test. # Otherwise take the next test.
self.lock.acquire() self.lock.acquire()
if self.canceled:
self.lock.release()
return None
try: try:
item = self.iter.next() item = self.iter.next()
except StopIteration: except StopIteration:
...@@ -346,6 +356,17 @@ def main(builtinParameters = {}): ...@@ -346,6 +356,17 @@ def main(builtinParameters = {}):
startTime = time.time() startTime = time.time()
display = TestingProgressDisplay(opts, len(tests), progressBar) display = TestingProgressDisplay(opts, len(tests), progressBar)
provider = TestProvider(tests, opts.maxTime) provider = TestProvider(tests, opts.maxTime)
try:
import win32api
except ImportError:
pass
else:
def console_ctrl_handler(type):
provider.cancel()
return True
win32api.SetConsoleCtrlHandler(console_ctrl_handler, True)
runTests(opts.numThreads, litConfig, provider, display) runTests(opts.numThreads, litConfig, provider, display)
display.finish() display.finish()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment