Use InterruptedError instead of checking for EINTR
This commit is contained in:
parent
dcbb822c08
commit
24d659daaf
17
Lib/_pyio.py
17
Lib/_pyio.py
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Reference in New Issue