diff --git a/lib/spack/llnl/util/tty/log.py b/lib/spack/llnl/util/tty/log.py index 7f88261e34..4738c8981a 100644 --- a/lib/spack/llnl/util/tty/log.py +++ b/lib/spack/llnl/util/tty/log.py @@ -131,8 +131,16 @@ def __init__(self, filename, echo=False, force_color=False, debug=False): # Spawn a daemon that writes what it reads from a pipe self.p = multiprocessing.Process(target=self._forward_redirected_pipe, args=(self.read,), name='logger_daemon') self.p.daemon = True + # I just need this to communicate to un-summon the daemon + self.parent_pipe, self.child_pipe = multiprocessing.Pipe() + + def acquire(self): self.p.start() + def release(self): + self.parent_pipe.send(True) + self.p.join(60.0) # 1 minute to join the child + def __enter__(self): """Redirect output from the with block to a file. @@ -165,6 +173,7 @@ def _forward_redirected_pipe(self, read): if read_file in rlist: line = read_file.readline() if not line: + # For some reason we never reach this point... break # Echo to stdout if requested. @@ -175,6 +184,9 @@ def _forward_redirected_pipe(self, read): log_file.write(_strip(line)) log_file.flush() + if self.child_pipe.poll(): + break + def _redirect_to_pipe(self, write): try: # Save old stdout and stderr @@ -216,7 +228,6 @@ def __exit__(self, exc_type, exception, traceback): tty._debug = self._debug def __del__(self): - """Closes the pipes and joins the daemon""" + """Closes the pipes""" os.close(self.write) - self.p.join(60.0) # 1 minute to join the daemonic child os.close(self.read)