Mercurial > cpython-lru_cache-weakref
diff Lib/subprocess.py @ 59207:55778855cd25
Merged revisions 78523 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r78523 | gregory.p.smith | 2010-02-28 16:05:08 -0800 (Sun, 28 Feb 2010) | 3 lines
Issue #1068268: The subprocess module now handles EINTR in internal
os.waitpid and os.read system calls where appropriate.
........
| author | Gregory P. Smith <greg@mad-scientist.com> |
|---|---|
| date | Mon, 01 Mar 2010 00:17:40 +0000 |
| parents | ffd800ef46ea |
| children | ac80884ddcc3 |
line wrap: on
line diff
--- a/Lib/subprocess.py Sun Feb 28 18:57:46 2010 +0000 +++ b/Lib/subprocess.py Mon Mar 01 00:17:40 2010 +0000 @@ -406,6 +406,16 @@ STDOUT = -2 +def _eintr_retry_call(func, *args): + while True: + try: + return func(*args) + except OSError as e: + if e.errno == errno.EINTR: + continue + raise + + def call(*popenargs, **kwargs): """Run command with arguments. Wait for command to complete, then return the returncode attribute. @@ -1133,13 +1143,13 @@ # Wait for exec to fail or succeed; possibly raising an # exception (limited to 1 MB) - data = os.read(errpipe_read, 1048576) + data = _eintr_retry_call(os.read, errpipe_read, 1048576) finally: # be sure the FD is closed no matter what os.close(errpipe_read) if data: - os.waitpid(self.pid, 0) + _eintr_retry_call(os.waitpid, self.pid, 0) child_exception = pickle.loads(data) for fd in (p2cwrite, c2pread, errread): if fd is not None: @@ -1175,7 +1185,7 @@ """Wait for child process to terminate. Returns returncode attribute.""" if self.returncode is None: - pid, sts = os.waitpid(self.pid, 0) + pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0) self._handle_exitstatus(sts) return self.returncode
