Skip to content

Commit

Permalink
[lit] Allow setting parallelism groups to None
Browse files Browse the repository at this point in the history
Check that we do not crash if a parallelism group is explicitly set to
None. Permits usage of the following pattern.

[lit.common.cfg]
  lit_config.parallelism_groups['my_group'] = None
  if <condition>:
    lit_config.parallelism_groups['my_group'] = 3

[project/lit.cfg]
  config.parallelism_group = 'my_group'

Reviewers: rnk

Differential Revision: https://reviews.llvm.org/D58305

llvm-svn: 354912
  • Loading branch information
yln committed Feb 26, 2019
1 parent 76eb4b0 commit eb38a70
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 6 deletions.
2 changes: 1 addition & 1 deletion llvm/utils/lit/lit/TestingConfig.py
Expand Up @@ -106,7 +106,7 @@ def __init__(self, parent, name, suffixes, test_format,
environment, substitutions, unsupported,
test_exec_root, test_source_root, excludes,
available_features, pipefail, limit_to_features = [],
is_early = False, parallelism_group = ""):
is_early = False, parallelism_group = None):
self.parent = parent
self.name = str(name)
self.suffixes = set(suffixes)
Expand Down
15 changes: 10 additions & 5 deletions llvm/utils/lit/lit/run.py
Expand Up @@ -17,6 +17,12 @@ def update(self, test):
if self.failedCount == self.maxFailures:
self.provider.cancel()

# No-operation semaphore for supporting `None` for parallelism_groups.
# lit_config.parallelism_groups['my_group'] = None
class NopSemaphore(object):
def acquire(self): pass
def release(self): pass

class Run(object):
"""
This class represents a concrete, configured testing run.
Expand All @@ -26,11 +32,10 @@ def __init__(self, lit_config, tests):
self.lit_config = lit_config
self.tests = tests
# Set up semaphores to limit parallelism of certain classes of tests.
# For example, some ASan tests require lots of virtual memory and run
# faster with less parallelism on OS X.
self.parallelism_semaphores = \
{k: multiprocessing.BoundedSemaphore(v) for k, v in
self.lit_config.parallelism_groups.items()}
self.parallelism_semaphores = {
k : NopSemaphore() if v is None else
multiprocessing.BoundedSemaphore(v)
for k, v in lit_config.parallelism_groups.items()}

def execute_tests_in_pool(self, jobs, max_time):
# We need to issue many wait calls, so compute the final deadline and
Expand Down
11 changes: 11 additions & 0 deletions llvm/utils/lit/tests/Inputs/parallelism-groups/lit.cfg
@@ -0,0 +1,11 @@
import lit.formats
config.name = 'parallelism-groups'
config.suffixes = ['.txt']
config.test_format = lit.formats.ShTest()
config.test_source_root = None
config.test_exec_root = None

# Should not crash
lit_config.parallelism_groups['my_group'] = None

config.parallelism_group = 'my_group'
1 change: 1 addition & 0 deletions llvm/utils/lit/tests/Inputs/parallelism-groups/test1.txt
@@ -0,0 +1 @@
# RUN: true
1 change: 1 addition & 0 deletions llvm/utils/lit/tests/Inputs/parallelism-groups/test2.txt
@@ -0,0 +1 @@
# RUN: true
21 changes: 21 additions & 0 deletions llvm/utils/lit/tests/parallelism-groups.py
@@ -0,0 +1,21 @@
# Check that we do not crash if a parallelism group is set to None. Permits
# usage of the following pattern.
#
# [lit.common.cfg]
# lit_config.parallelism_groups['my_group'] = None
# if <condition>:
# lit_config.parallelism_groups['my_group'] = 3
#
# [project/lit.cfg]
# config.parallelism_group = 'my_group'
#
# Note: We need at least 2 tests to prevent lit from using "single process
# mode", which ignores parallelism groups.
#

# RUN: %{lit} -j2 %{inputs}/parallelism-groups | FileCheck %s

# CHECK: -- Testing: 2 tests, 2 threads --
# CHECK-DAG: PASS: parallelism-groups :: test1.txt
# CHECK-DAG: PASS: parallelism-groups :: test2.txt
# CHECK: Expected Passes : 2

0 comments on commit eb38a70

Please sign in to comment.