|  | @@ -41,6 +41,7 @@ import subprocess
 | 
	
		
			
				|  |  |  import sys
 | 
	
		
			
				|  |  |  import tempfile
 | 
	
		
			
				|  |  |  import time
 | 
	
		
			
				|  |  | +import errno
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  # cpu cost measurement
 | 
	
	
		
			
				|  | @@ -132,29 +133,44 @@ _TAG_COLOR = {
 | 
	
		
			
				|  |  |  _FORMAT = '%(asctime)-15s %(message)s'
 | 
	
		
			
				|  |  |  logging.basicConfig(level=logging.INFO, format=_FORMAT)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def eintr_be_gone(fn):
 | 
	
		
			
				|  |  | +  """Run fn until it doesn't stop because of EINTR"""
 | 
	
		
			
				|  |  | +  while True:
 | 
	
		
			
				|  |  | +    try:
 | 
	
		
			
				|  |  | +      return fn()
 | 
	
		
			
				|  |  | +    except IOError, e:
 | 
	
		
			
				|  |  | +      if e.errno != errno.EINTR:
 | 
	
		
			
				|  |  | +        raise
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  def message(tag, msg, explanatory_text=None, do_newline=False):
 | 
	
		
			
				|  |  |    if message.old_tag == tag and message.old_msg == msg and not explanatory_text:
 | 
	
		
			
				|  |  |      return
 | 
	
		
			
				|  |  |    message.old_tag = tag
 | 
	
		
			
				|  |  |    message.old_msg = msg
 | 
	
		
			
				|  |  | -  try:
 | 
	
		
			
				|  |  | -    if platform_string() == 'windows' or not sys.stdout.isatty():
 | 
	
		
			
				|  |  | -      if explanatory_text:
 | 
	
		
			
				|  |  | -        logging.info(explanatory_text)
 | 
	
		
			
				|  |  | -      logging.info('%s: %s', tag, msg)
 | 
	
		
			
				|  |  | -    else:
 | 
	
		
			
				|  |  | -      sys.stdout.write('%s%s%s\x1b[%d;%dm%s\x1b[0m: %s%s' % (
 | 
	
		
			
				|  |  | -          _BEGINNING_OF_LINE,
 | 
	
		
			
				|  |  | -          _CLEAR_LINE,
 | 
	
		
			
				|  |  | -          '\n%s' % explanatory_text if explanatory_text is not None else '',
 | 
	
		
			
				|  |  | -          _COLORS[_TAG_COLOR[tag]][1],
 | 
	
		
			
				|  |  | -          _COLORS[_TAG_COLOR[tag]][0],
 | 
	
		
			
				|  |  | -          tag,
 | 
	
		
			
				|  |  | -          msg,
 | 
	
		
			
				|  |  | -          '\n' if do_newline or explanatory_text is not None else ''))
 | 
	
		
			
				|  |  | -    sys.stdout.flush()
 | 
	
		
			
				|  |  | -  except:
 | 
	
		
			
				|  |  | -    pass
 | 
	
		
			
				|  |  | +  while True:
 | 
	
		
			
				|  |  | +    try:
 | 
	
		
			
				|  |  | +      if platform_string() == 'windows' or not sys.stdout.isatty():
 | 
	
		
			
				|  |  | +        if explanatory_text:
 | 
	
		
			
				|  |  | +          logging.info(explanatory_text)
 | 
	
		
			
				|  |  | +        logging.info('%s: %s', tag, msg)
 | 
	
		
			
				|  |  | +      else:
 | 
	
		
			
				|  |  | +        sys.stdout.write('%s%s%s\x1b[%d;%dm%s\x1b[0m: %s%s' % (
 | 
	
		
			
				|  |  | +            _BEGINNING_OF_LINE,
 | 
	
		
			
				|  |  | +            _CLEAR_LINE,
 | 
	
		
			
				|  |  | +            '\n%s' % explanatory_text if explanatory_text is not None else '',
 | 
	
		
			
				|  |  | +            _COLORS[_TAG_COLOR[tag]][1],
 | 
	
		
			
				|  |  | +            _COLORS[_TAG_COLOR[tag]][0],
 | 
	
		
			
				|  |  | +            tag,
 | 
	
		
			
				|  |  | +            msg,
 | 
	
		
			
				|  |  | +            '\n' if do_newline or explanatory_text is not None else ''))
 | 
	
		
			
				|  |  | +      sys.stdout.flush()
 | 
	
		
			
				|  |  | +      return
 | 
	
		
			
				|  |  | +    except IOError, e:
 | 
	
		
			
				|  |  | +      if e.errno != errno.EINTR:
 | 
	
		
			
				|  |  | +        raise
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  message.old_tag = ''
 | 
	
		
			
				|  |  |  message.old_msg = ''
 | 
	
	
		
			
				|  | @@ -226,16 +242,6 @@ class JobResult(object):
 | 
	
		
			
				|  |  |      self.cpu_measured = 0
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -def eintr_be_gone(fn):
 | 
	
		
			
				|  |  | -  """Run fn until it doesn't stop because of EINTR"""
 | 
	
		
			
				|  |  | -  while True:
 | 
	
		
			
				|  |  | -    try:
 | 
	
		
			
				|  |  | -      return fn()
 | 
	
		
			
				|  |  | -    except IOError, e:
 | 
	
		
			
				|  |  | -      if e.errno != errno.EINTR:
 | 
	
		
			
				|  |  | -        raise
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  def read_from_start(f):
 | 
	
		
			
				|  |  |    f.seek(0)
 | 
	
		
			
				|  |  |    return f.read()
 |