|  | @@ -29,13 +29,23 @@ class ValgrindConfig(object):
 | 
	
		
			
				|  |  |      return ['valgrind', binary]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +# SanConfig: compile with CONFIG=config, filter out incompatible binaries
 | 
	
		
			
				|  |  | +class SanConfig(object):
 | 
	
		
			
				|  |  | +  def __init__(self, config):
 | 
	
		
			
				|  |  | +    self.build_config = config
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  def run_command(self, binary):
 | 
	
		
			
				|  |  | +    if '_ssl_' in binary:
 | 
	
		
			
				|  |  | +      return None
 | 
	
		
			
				|  |  | +    return [binary]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  # different configurations we can run under
 | 
	
		
			
				|  |  |  _CONFIGS = {
 | 
	
		
			
				|  |  |    'dbg': SimpleConfig('dbg'),
 | 
	
		
			
				|  |  |    'opt': SimpleConfig('opt'),
 | 
	
		
			
				|  |  | -  'tsan': SimpleConfig('tsan'),
 | 
	
		
			
				|  |  | -  'msan': SimpleConfig('msan'),
 | 
	
		
			
				|  |  | -  'asan': SimpleConfig('asan'),
 | 
	
		
			
				|  |  | +  'tsan': SanConfig('tsan'),
 | 
	
		
			
				|  |  | +  'msan': SanConfig('msan'),
 | 
	
		
			
				|  |  | +  'asan': SanConfig('asan'),
 | 
	
		
			
				|  |  |    'gcov': SimpleConfig('gcov'),
 | 
	
		
			
				|  |  |    'valgrind': ValgrindConfig('dbg'),
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -81,14 +91,15 @@ 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):
 | 
	
		
			
				|  |  |      return 2
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    return 0
 |