Use InterruptedError instead of checking for EINTR

This commit is contained in:
Antoine Pitrou 2011-10-23 23:49:42 +02:00
parent dcbb822c08
commit 24d659daaf
6 changed files with 17 additions and 38 deletions

View File

@ -14,7 +14,6 @@ except ImportError:
import io import io
from io import (__all__, SEEK_SET, SEEK_CUR, SEEK_END) from io import (__all__, SEEK_SET, SEEK_CUR, SEEK_END)
from errno import EINTR
# open() uses st_blksize whenever we can # open() uses st_blksize whenever we can
DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes
@ -948,9 +947,7 @@ class BufferedReader(_BufferedIOMixin):
# Read until EOF or until read() would block. # Read until EOF or until read() would block.
try: try:
chunk = self.raw.read() chunk = self.raw.read()
except IOError as e: except InterruptedError:
if e.errno != EINTR:
raise
continue continue
if chunk in empty_values: if chunk in empty_values:
nodata_val = chunk nodata_val = chunk
@ -972,9 +969,7 @@ class BufferedReader(_BufferedIOMixin):
while avail < n: while avail < n:
try: try:
chunk = self.raw.read(wanted) chunk = self.raw.read(wanted)
except IOError as e: except InterruptedError:
if e.errno != EINTR:
raise
continue continue
if chunk in empty_values: if chunk in empty_values:
nodata_val = chunk nodata_val = chunk
@ -1007,9 +1002,7 @@ class BufferedReader(_BufferedIOMixin):
while True: while True:
try: try:
current = self.raw.read(to_read) current = self.raw.read(to_read)
except IOError as e: except InterruptedError:
if e.errno != EINTR:
raise
continue continue
break break
if current: if current:
@ -1120,9 +1113,7 @@ class BufferedWriter(_BufferedIOMixin):
while self._write_buf: while self._write_buf:
try: try:
n = self.raw.write(self._write_buf) n = self.raw.write(self._write_buf)
except IOError as e: except InterruptedError:
if e.errno != EINTR:
raise
continue continue
if n > len(self._write_buf) or n < 0: if n > len(self._write_buf) or n < 0:
raise IOError("write() returned incorrect number of bytes") raise IOError("write() returned incorrect number of bytes")

View File

@ -54,7 +54,7 @@ import warnings
import os import os
from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, EINVAL, \ from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, EINVAL, \
ENOTCONN, ESHUTDOWN, EINTR, EISCONN, EBADF, ECONNABORTED, EPIPE, EAGAIN, \ ENOTCONN, ESHUTDOWN, EISCONN, EBADF, ECONNABORTED, EPIPE, EAGAIN, \
errorcode errorcode
_DISCONNECTED = frozenset((ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED, EPIPE, _DISCONNECTED = frozenset((ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED, EPIPE,
@ -143,11 +143,8 @@ def poll(timeout=0.0, map=None):
try: try:
r, w, e = select.select(r, w, e, timeout) r, w, e = select.select(r, w, e, timeout)
except select.error as err: except InterruptedError:
if err.args[0] != EINTR: return
raise
else:
return
for fd in r: for fd in r:
obj = map.get(fd) obj = map.get(fd)
@ -190,9 +187,7 @@ def poll2(timeout=0.0, map=None):
pollster.register(fd, flags) pollster.register(fd, flags)
try: try:
r = pollster.poll(timeout) r = pollster.poll(timeout)
except select.error as err: except InterruptedError:
if err.args[0] != EINTR:
raise
r = [] r = []
for fd, flags in r: for fd, flags in r:
obj = map.get(fd) obj = map.get(fd)

View File

@ -327,15 +327,12 @@ class ForkAwareLocal(threading.local):
# Automatic retry after EINTR # Automatic retry after EINTR
# #
def _eintr_retry(func, _errors=(EnvironmentError, select.error)): def _eintr_retry(func):
@functools.wraps(func) @functools.wraps(func)
def wrapped(*args, **kwargs): def wrapped(*args, **kwargs):
while True: while True:
try: try:
return func(*args, **kwargs) return func(*args, **kwargs)
except _errors as e: except InterruptedError:
# select.error has no `errno` attribute continue
if e.args[0] == errno.EINTR:
continue
raise
return wrapped return wrapped

View File

@ -53,7 +53,6 @@ try:
except ImportError: except ImportError:
errno = None errno = None
EBADF = getattr(errno, 'EBADF', 9) EBADF = getattr(errno, 'EBADF', 9)
EINTR = getattr(errno, 'EINTR', 4)
EAGAIN = getattr(errno, 'EAGAIN', 11) EAGAIN = getattr(errno, 'EAGAIN', 11)
EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11) EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11)
@ -280,11 +279,10 @@ class SocketIO(io.RawIOBase):
except timeout: except timeout:
self._timeout_occurred = True self._timeout_occurred = True
raise raise
except InterruptedError:
continue
except error as e: except error as e:
n = e.args[0] if e.args[0] in _blocking_errnos:
if n == EINTR:
continue
if n in _blocking_errnos:
return None return None
raise raise

View File

@ -450,10 +450,8 @@ def _eintr_retry_call(func, *args):
while True: while True:
try: try:
return func(*args) return func(*args)
except (OSError, IOError) as e: except InterruptedError:
if e.errno == errno.EINTR: continue
continue
raise
def call(*popenargs, timeout=None, **kwargs): def call(*popenargs, timeout=None, **kwargs):

View File

@ -3584,7 +3584,7 @@ class FileObjectInterruptedTestCase(unittest.TestCase):
@staticmethod @staticmethod
def _raise_eintr(): def _raise_eintr():
raise socket.error(errno.EINTR) raise socket.error(errno.EINTR, "interrupted")
def _textiowrap_mock_socket(self, mock, buffering=-1): def _textiowrap_mock_socket(self, mock, buffering=-1):
raw = socket.SocketIO(mock, "r") raw = socket.SocketIO(mock, "r")