|  | @@ -15,6 +15,7 @@ import watch_dirs
 | 
	
		
			
				|  |  |  class SimpleConfig(object):
 | 
	
		
			
				|  |  |    def __init__(self, config):
 | 
	
		
			
				|  |  |      self.build_config = config
 | 
	
		
			
				|  |  | +    self.maxjobs = 32 * multiprocessing.cpu_count()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    def run_command(self, binary):
 | 
	
		
			
				|  |  |      return [binary]
 | 
	
	
		
			
				|  | @@ -22,11 +23,13 @@ class SimpleConfig(object):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  # ValgrindConfig: compile with some CONFIG=config, but use valgrind to run
 | 
	
		
			
				|  |  |  class ValgrindConfig(object):
 | 
	
		
			
				|  |  | -  def __init__(self, config):
 | 
	
		
			
				|  |  | +  def __init__(self, config, tool):
 | 
	
		
			
				|  |  |      self.build_config = config
 | 
	
		
			
				|  |  | +    self.tool = tool
 | 
	
		
			
				|  |  | +    self.maxjobs = 4 * multiprocessing.cpu_count()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    def run_command(self, binary):
 | 
	
		
			
				|  |  | -    return ['valgrind', binary]
 | 
	
		
			
				|  |  | +    return ['valgrind', binary, '--tool=%s' % self.tool]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  # different configurations we can run under
 | 
	
	
		
			
				|  | @@ -37,7 +40,8 @@ _CONFIGS = {
 | 
	
		
			
				|  |  |    'msan': SimpleConfig('msan'),
 | 
	
		
			
				|  |  |    'asan': SimpleConfig('asan'),
 | 
	
		
			
				|  |  |    'gcov': SimpleConfig('gcov'),
 | 
	
		
			
				|  |  | -  'valgrind': ValgrindConfig('dbg'),
 | 
	
		
			
				|  |  | +  'memcheck': ValgrindConfig('dbg', 'memcheck'),
 | 
	
		
			
				|  |  | +  'helgrind': ValgrindConfig('dbg', 'helgrind')
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -81,14 +85,18 @@ def _build_and_run(check_cancelled):
 | 
	
		
			
				|  |  |      return 1
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    # run all the tests
 | 
	
		
			
				|  |  | -  if not jobset.run((
 | 
	
		
			
				|  |  | -      config.run_command(x)
 | 
	
		
			
				|  |  | -      for config in run_configs
 | 
	
		
			
				|  |  | -      for filt in filters
 | 
	
		
			
				|  |  | -      for x in itertools.chain.from_iterable(itertools.repeat(
 | 
	
		
			
				|  |  | -          glob.glob('bins/%s/%s_test' % (
 | 
	
		
			
				|  |  | -              config.build_config, filt)),
 | 
	
		
			
				|  |  | -          runs_per_test))), check_cancelled):
 | 
	
		
			
				|  |  | +  if not jobset.run(
 | 
	
		
			
				|  |  | +      itertools.ifilter(
 | 
	
		
			
				|  |  | +          lambda x: x is not None, (
 | 
	
		
			
				|  |  | +              config.run_command(x)
 | 
	
		
			
				|  |  | +              for config in run_configs
 | 
	
		
			
				|  |  | +              for filt in filters
 | 
	
		
			
				|  |  | +              for x in itertools.chain.from_iterable(itertools.repeat(
 | 
	
		
			
				|  |  | +                  glob.glob('bins/%s/%s_test' % (
 | 
	
		
			
				|  |  | +                      config.build_config, filt)),
 | 
	
		
			
				|  |  | +                  runs_per_test)))),
 | 
	
		
			
				|  |  | +              check_cancelled,
 | 
	
		
			
				|  |  | +              maxjobs=min(c.maxjobs for c in run_configs)):
 | 
	
		
			
				|  |  |      return 2
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    return 0
 |