diff options
Diffstat (limited to 'deps/v8/tools/testrunner/local/command.py')
-rw-r--r-- | deps/v8/tools/testrunner/local/command.py | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/deps/v8/tools/testrunner/local/command.py b/deps/v8/tools/testrunner/local/command.py index 93b1ac9497..adc9c2e452 100644 --- a/deps/v8/tools/testrunner/local/command.py +++ b/deps/v8/tools/testrunner/local/command.py @@ -4,6 +4,7 @@ import os +import signal import subprocess import sys import threading @@ -17,6 +18,19 @@ SEM_INVALID_VALUE = -1 SEM_NOGPFAULTERRORBOX = 0x0002 # Microsoft Platform SDK WinBase.h +def setup_testing(): + """For testing only: We use threading under the hood instead of + multiprocessing to make coverage work. Signal handling is only supported + in the main thread, so we disable it for testing. + """ + signal.signal = lambda *_: None + + +class AbortException(Exception): + """Indicates early abort on SIGINT, SIGTERM or internal hard timeout.""" + pass + + class BaseCommand(object): def __init__(self, shell, args=None, cmd_prefix=None, timeout=60, env=None, verbose=False): @@ -35,10 +49,16 @@ class BaseCommand(object): process = self._start_process(**additional_popen_kwargs) + # Variable to communicate with the signal handler. + abort_occured = [False] + def handler(signum, frame): + self._abort(process, abort_occured) + signal.signal(signal.SIGTERM, handler) + # Variable to communicate with the timer. timeout_occured = [False] timer = threading.Timer( - self.timeout, self._on_timeout, [process, timeout_occured]) + self.timeout, self._abort, [process, timeout_occured]) timer.start() start_time = time.time() @@ -47,6 +67,9 @@ class BaseCommand(object): timer.cancel() + if abort_occured[0]: + raise AbortException() + return output.Output( process.returncode, timeout_occured[0], @@ -85,12 +108,12 @@ class BaseCommand(object): def _kill_process(self, process): raise NotImplementedError() - def _on_timeout(self, process, timeout_occured): - timeout_occured[0] = True + def _abort(self, process, abort_called): + abort_called[0] = True try: self._kill_process(process) except OSError: - sys.stderr.write('Error: Process %s already ended.\n' % process.pid) + pass def __str__(self): return self.to_string() |