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
This commit is contained in:
parent
4652d893bc
commit
b21ebec2c4
|
@ -76,6 +76,12 @@ class TestProvider:
|
|||
self.iter = iter(tests)
|
||||
self.lock = threading.Lock()
|
||||
self.startTime = time.time()
|
||||
self.canceled = False
|
||||
|
||||
def cancel(self):
|
||||
self.lock.acquire()
|
||||
self.canceled = True
|
||||
self.lock.release()
|
||||
|
||||
def get(self):
|
||||
# Check if we have run out of time.
|
||||
|
@ -85,6 +91,10 @@ class TestProvider:
|
|||
|
||||
# Otherwise take the next test.
|
||||
self.lock.acquire()
|
||||
if self.canceled:
|
||||
self.lock.release()
|
||||
return None
|
||||
|
||||
try:
|
||||
item = self.iter.next()
|
||||
except StopIteration:
|
||||
|
@ -346,6 +356,17 @@ def main(builtinParameters = {}):
|
|||
startTime = time.time()
|
||||
display = TestingProgressDisplay(opts, len(tests), progressBar)
|
||||
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)
|
||||
display.finish()
|
||||
|
||||
|
|
Loading…
Reference in New Issue