From: Gabe Black Date: Thu, 26 Jul 2018 23:06:01 +0000 (-0700) Subject: systemc: Extend the execute phase of verify.py. X-Git-Tag: v19.0.0.0~1819 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c1e24eda83ef1621842a24e810c8656dfe0fcbbc;p=gem5.git systemc: Extend the execute phase of verify.py. Add -j and --timeout options to the execute phase of verify.py. The --timeout option is implemented using the timeout utility program which is assumed to be available on the host system. Python 3.3 added a timeout argument to the subprocess module which is an alternative approach, but then we would be dependent on python 3.3. -j is implemented using the standard multiprocess.pool.ThreadPool class. Change-Id: I15b92f2b14de6710e2027a6a19984b2644b2a8df Reviewed-on: https://gem5-review.googlesource.com/12051 Reviewed-by: Gabe Black Maintainer: Gabe Black --- diff --git a/src/systemc/tests/verify.py b/src/systemc/tests/verify.py index 34ae93110..cface4761 100755 --- a/src/systemc/tests/verify.py +++ b/src/systemc/tests/verify.py @@ -35,6 +35,7 @@ import inspect import itertools import json import logging +import multiprocessing.pool import os import subprocess import sys @@ -120,16 +121,39 @@ class RunPhase(TestPhaseBase): number = 2 def run(self, tests): - for test in tests: - if test.compile_only: - continue - args = [ + parser = argparse.ArgumentParser() + parser.add_argument('--timeout', type=int, metavar='SECONDS', + help='Time limit for each run in seconds.', + default=0) + parser.add_argument('-j', type=int, default=1, + help='How many tests to run in parallel.') + args = parser.parse_args(self.args) + + timeout_cmd = [ + 'timeout', + '--kill-after', str(args.timeout * 2), + str(args.timeout) + ] + def run_test(test): + cmd = [] + if args.timeout: + cmd.extend(timeout_cmd) + cmd.extend([ test.full_path(), '-red', test.m5out_dir(), '--listener-mode=off', config_path - ] - subprocess.check_call(args) + ]) + subprocess.check_call(cmd) + + runnable = filter(lambda t: not t.compile_only, tests) + if args.j == 1: + map(run_test, runnable) + else: + tp = multiprocessing.pool.ThreadPool(args.j) + map(lambda t: tp.apply_async(run_test, (t,)), runnable) + tp.close() + tp.join() class VerifyPhase(TestPhaseBase): name = 'verify'