summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/utils/lit/lit/LitConfig.py4
-rw-r--r--llvm/utils/lit/lit/TestingConfig.py3
-rwxr-xr-xllvm/utils/lit/lit/main.py3
-rw-r--r--llvm/utils/lit/lit/run.py18
4 files changed, 23 insertions, 5 deletions
diff --git a/llvm/utils/lit/lit/LitConfig.py b/llvm/utils/lit/lit/LitConfig.py
index fc50ffc1039..2b680846e17 100644
--- a/llvm/utils/lit/lit/LitConfig.py
+++ b/llvm/utils/lit/lit/LitConfig.py
@@ -24,7 +24,8 @@ class LitConfig(object):
noExecute, debug, isWindows,
params, config_prefix = None,
maxIndividualTestTime = 0,
- maxFailures = None):
+ maxFailures = None,
+ parallelism_groups = []):
# The name of the test runner.
self.progname = progname
# The items to add to the PATH environment variable.
@@ -62,6 +63,7 @@ class LitConfig(object):
self.maxIndividualTestTime = maxIndividualTestTime
self.maxFailures = maxFailures
+ self.parallelism_groups = parallelism_groups
@property
def maxIndividualTestTime(self):
diff --git a/llvm/utils/lit/lit/TestingConfig.py b/llvm/utils/lit/lit/TestingConfig.py
index 717b53c67fb..c729ec060ac 100644
--- a/llvm/utils/lit/lit/TestingConfig.py
+++ b/llvm/utils/lit/lit/TestingConfig.py
@@ -106,7 +106,7 @@ class TestingConfig:
environment, substitutions, unsupported,
test_exec_root, test_source_root, excludes,
available_features, pipefail, limit_to_features = [],
- is_early = False):
+ is_early = False, parallelism_group = ""):
self.parent = parent
self.name = str(name)
self.suffixes = set(suffixes)
@@ -125,6 +125,7 @@ class TestingConfig:
self.limit_to_features = set(limit_to_features)
# Whether the suite should be tested early in a given run.
self.is_early = bool(is_early)
+ self.parallelism_group = parallelism_group
def finish(self, litConfig):
"""finish() - Finish this config object, after loading is complete."""
diff --git a/llvm/utils/lit/lit/main.py b/llvm/utils/lit/lit/main.py
index 216ccfd71ae..95032c6931a 100755
--- a/llvm/utils/lit/lit/main.py
+++ b/llvm/utils/lit/lit/main.py
@@ -335,7 +335,8 @@ def main_with_tmp(builtinParameters):
params = userParams,
config_prefix = opts.configPrefix,
maxIndividualTestTime = maxIndividualTestTime,
- maxFailures = opts.maxFailures)
+ maxFailures = opts.maxFailures,
+ parallelism_groups = {})
# Perform test discovery.
run = lit.run.Run(litConfig,
diff --git a/llvm/utils/lit/lit/run.py b/llvm/utils/lit/lit/run.py
index f7e84d316a7..2be8a1133b9 100644
--- a/llvm/utils/lit/lit/run.py
+++ b/llvm/utils/lit/lit/run.py
@@ -177,9 +177,15 @@ class Run(object):
self.tests = tests
def execute_test(self, test):
+ pg = test.config.parallelism_group
+ if callable(pg): pg = pg(test)
+
result = None
- start_time = time.time()
+ semaphore = None
try:
+ if pg: semaphore = self.parallelism_semaphores[pg]
+ if semaphore: semaphore.acquire()
+ start_time = time.time()
result = test.config.test_format.execute(test, self.lit_config)
# Support deprecated result from execute() which returned the result
@@ -189,6 +195,8 @@ class Run(object):
result = lit.Test.Result(code, output)
elif not isinstance(result, lit.Test.Result):
raise ValueError("unexpected result from test execution")
+
+ result.elapsed = time.time() - start_time
except KeyboardInterrupt:
raise
except:
@@ -198,7 +206,8 @@ class Run(object):
output += traceback.format_exc()
output += '\n'
result = lit.Test.Result(lit.Test.UNRESOLVED, output)
- result.elapsed = time.time() - start_time
+ finally:
+ if semaphore: semaphore.release()
test.setResult(result)
@@ -231,6 +240,7 @@ class Run(object):
try:
task_impl = multiprocessing.Process
queue_impl = multiprocessing.Queue
+ sem_impl = multiprocessing.Semaphore
canceled_flag = multiprocessing.Value('i', 0)
consumer = MultiprocessResultsConsumer(self, display, jobs)
except:
@@ -242,9 +252,13 @@ class Run(object):
if not consumer:
task_impl = threading.Thread
queue_impl = queue.Queue
+ sem_impl = threading.Semaphore
canceled_flag = LockedValue(0)
consumer = ThreadResultsConsumer(display)
+ self.parallelism_semaphores = {k: sem_impl(v)
+ for k, v in self.lit_config.parallelism_groups.items()}
+
# Create the test provider.
provider = TestProvider(queue_impl, canceled_flag)
handleFailures(provider, consumer, self.lit_config.maxFailures)
OpenPOWER on IntegriCloud