diff --git a/moulinette/utils/process.py b/moulinette/utils/process.py index 2151763f..6e10d4dd 100644 --- a/moulinette/utils/process.py +++ b/moulinette/utils/process.py @@ -64,6 +64,9 @@ def call_async_output(args, callback, **kwargs): assert len(callback) == 3 stdinfo = kwargs.pop("stdinfo") os.mkfifo(stdinfo, 0600) + # Open stdinfo for reading (in a nonblocking way, i.e. even + # if command does not write in the stdinfo pipe...) + stdinfo_f = os.open(stdinfo, os.O_RDONLY|os.O_NONBLOCK) else: kwargs.pop("stdinfo") stdinfo = None @@ -90,17 +93,7 @@ def call_async_output(args, callback, **kwargs): if separate_stderr: stderr_reader, stderr_consum = async_file_reading(p.stderr, callback[1]) if stdinfo: - # Open stdinfo for reading (in a nonblocking way, i.e. even - # if command does not write in the stdinfo pipe...) - stdinfo_f = os.open(stdinfo, os.O_RDONLY|os.O_NONBLOCK) stdinfo_reader, stdinfo_consum = async_file_reading(stdinfo_f, callback[2]) - while not stdout_reader.eof() or not stderr_reader.eof(): - time.sleep(.1) - # Remove the stdinfo pipe - os.remove(stdinfo) - os.rmdir(os.path.dirname(stdinfo)) - stdinfo_reader.join() - stdinfo_consum.join() while not stdout_reader.eof() or not stderr_reader.eof(): time.sleep(.1) @@ -112,6 +105,13 @@ def call_async_output(args, callback, **kwargs): stdout_reader.join() stdout_consum.join() + if stdinfo: + # Remove the stdinfo pipe + os.remove(stdinfo) + os.rmdir(os.path.dirname(stdinfo)) + stdinfo_reader.join() + stdinfo_consum.join() + # on slow hardware, in very edgy situations it is possible that the process # isn't finished just after having closed stdout and stderr, so we wait a # bit to give hime the time to finish (while having a timeout) diff --git a/moulinette/utils/stream.py b/moulinette/utils/stream.py index 32dbaa41..7b16897e 100644 --- a/moulinette/utils/stream.py +++ b/moulinette/utils/stream.py @@ -41,15 +41,13 @@ class AsynchronousFileReader(Process): else: data = "" while True: - # If nobody's writing in there anymore, get out - if os.fstat(self._fd).st_nlink == 0: - print "Plop" - self._queue.put("(Info returning because no link)") - return - - # Read (non-blockingly) a few bytes, append them to the buffer + # Try to read (non-blockingly) a few bytes, append them to + # the buffer data += os.read(self._fd, 50) - print data + + # If nobody's writing in there anymore, get out + if not data and os.fstat(self._fd).st_nlink == 0: + return # If we have data, extract a line (ending with \n) and feed # it to the consumer @@ -58,7 +56,7 @@ class AsynchronousFileReader(Process): self._queue.put(lines[0]) data = '\n'.join(lines[1:]) else: - time.sleep(0.1) + time.sleep(0.05) def eof(self): """Check whether there is no more content to expect."""