diff options
Diffstat (limited to 'tools/run_tests/jobset.py')
-rwxr-xr-x | tools/run_tests/jobset.py | 54 |
1 files changed, 36 insertions, 18 deletions
diff --git a/tools/run_tests/jobset.py b/tools/run_tests/jobset.py index 81cdd0e6e4..efe040aeb6 100755 --- a/tools/run_tests/jobset.py +++ b/tools/run_tests/jobset.py @@ -32,6 +32,7 @@ import hashlib import multiprocessing import os +import platform import random import signal import subprocess @@ -43,17 +44,19 @@ import time _DEFAULT_MAX_JOBS = 16 * multiprocessing.cpu_count() -have_alarm = False -def alarm_handler(unused_signum, unused_frame): - global have_alarm - have_alarm = False - - # setup a signal handler so that signal.pause registers 'something' # when a child finishes # not using futures and threading to avoid a dependency on subprocess32 -signal.signal(signal.SIGCHLD, lambda unused_signum, unused_frame: None) -signal.signal(signal.SIGALRM, alarm_handler) +if platform.system() == "Windows": + pass +else: + have_alarm = False + def alarm_handler(unused_signum, unused_frame): + global have_alarm + have_alarm = False + + signal.signal(signal.SIGCHLD, lambda unused_signum, unused_frame: None) + signal.signal(signal.SIGALRM, alarm_handler) def shuffle_iteratable(it): @@ -109,6 +112,11 @@ _TAG_COLOR = { def message(tag, message, explanatory_text=None, do_newline=False): + if platform.system() == 'Windows': + if explanatory_text: + print explanatory_text + print '%s: %s' % (tag, message) + return try: sys.stdout.write('%s%s%s\x1b[%d;%dm%s\x1b[0m: %s%s' % ( _BEGINNING_OF_LINE, @@ -136,7 +144,7 @@ def which(filename): class JobSpec(object): """Specifies what to run for a job.""" - def __init__(self, cmdline, shortname=None, environ=None, hash_targets=None): + def __init__(self, cmdline, shortname=None, environ=None, hash_targets=None, cwd=None): """ Arguments: cmdline: a list of arguments to pass as the command line @@ -152,6 +160,7 @@ class JobSpec(object): self.environ = environ self.shortname = cmdline[0] if shortname is None else shortname self.hash_targets = hash_targets or [] + self.cwd = cwd def identity(self): return '%r %r %r' % (self.cmdline, self.environ, self.hash_targets) @@ -177,6 +186,7 @@ class Job(object): self._process = subprocess.Popen(args=spec.cmdline, stderr=subprocess.STDOUT, stdout=self._tempfile, + cwd=spec.cwd, env=env) self._state = _RUNNING self._newline_on_success = newline_on_success @@ -241,10 +251,15 @@ class Jobset(object): bin_hash = None should_run = True if should_run: - self._running.add(Job(spec, - bin_hash, - self._newline_on_success, - self._travis)) + try: + self._running.add(Job(spec, + bin_hash, + self._newline_on_success, + self._travis)) + except: + message('FAILED', spec.shortname) + self._cancelled = True + return False return True def reap(self): @@ -264,11 +279,14 @@ class Jobset(object): if (not self._travis): message('WAITING', '%d jobs running, %d complete, %d failed' % ( len(self._running), self._completed, self._failures)) - global have_alarm - if not have_alarm: - have_alarm = True - signal.alarm(10) - signal.pause() + if platform.system() == 'Windows': + time.sleep(0.1) + else: + global have_alarm + if not have_alarm: + have_alarm = True + signal.alarm(10) + signal.pause() def cancelled(self): """Poll for cancellation.""" |