diff options
Diffstat (limited to 'regtest')
-rw-r--r-- | regtest/backends/__init__.py | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/regtest/backends/__init__.py b/regtest/backends/__init__.py index aa120228..b57d8aa4 100644 --- a/regtest/backends/__init__.py +++ b/regtest/backends/__init__.py @@ -18,6 +18,7 @@ import hashlib import os +import select import shutil import errno from Config import Config @@ -193,13 +194,6 @@ class Backend: return False return os.path.exists(test_result + self._diff_ext) - def __create_stderr_file(self, stderr, out_path): - if not stderr: - return - stderr_file = open(out_path + '.stderr', 'wb') - stderr_file.write(stderr) - stderr_file.close() - def __create_failed_file_if_needed(self, status, out_path): if os.WIFEXITED(status) or os.WEXITSTATUS(status) == 0: return False @@ -210,10 +204,36 @@ class Backend: return True - def _check_exit_status(self, p, out_path): - stderr = p.stderr.read() - self.__create_stderr_file(stderr, out_path) + def __redirect_stderr_to_file(self, fd, out_path): + stderr_file = None + read_set = [fd] + while read_set: + try: + rlist, wlist, xlist = select.select(read_set, [], []) + except select.error as e: + continue + + if fd in rlist: + try: + chunk = os.read(fd, 1024) + except OSError as e: + if e.errno == errno.EIO: + # Child process finished. + chunk = '' + else: + raise e + if chunk: + if stderr_file is None: + stderr_file = open(out_path + '.stderr', 'wb') + stderr_file.write(chunk) + else: + read_set.remove(fd) + if stderr_file is not None: + stderr_file.close() + + def _check_exit_status(self, p, out_path): + self.__redirect_stderr_to_file(p.stderr.fileno(), out_path) status = p.wait() if not os.WIFEXITED(status): |