Use InterruptedError instead of checking for EINTR
authorAntoine Pitrou <solipsis@pitrou.net>
Sun, 23 Oct 2011 21:49:42 +0000 (23:49 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Sun, 23 Oct 2011 21:49:42 +0000 (23:49 +0200)
Lib/_pyio.py
Lib/asyncore.py
Lib/multiprocessing/util.py
Lib/socket.py
Lib/subprocess.py
Lib/test/test_socket.py

index 0611bd6f820c41d837a6eed2483edbe5643fb16e..3bd35d2e924e2c1594783ed210e9965856250383 100644 (file)
@@ -14,7 +14,6 @@ except ImportError:
 
 import io
 from io import (__all__, SEEK_SET, SEEK_CUR, SEEK_END)
-from errno import EINTR
 
 # open() uses st_blksize whenever we can
 DEFAULT_BUFFER_SIZE = 8 * 1024  # bytes
@@ -948,9 +947,7 @@ class BufferedReader(_BufferedIOMixin):
                 # Read until EOF or until read() would block.
                 try:
                     chunk = self.raw.read()
-                except IOError as e:
-                    if e.errno != EINTR:
-                        raise
+                except InterruptedError:
                     continue
                 if chunk in empty_values:
                     nodata_val = chunk
@@ -972,9 +969,7 @@ class BufferedReader(_BufferedIOMixin):
         while avail < n:
             try:
                 chunk = self.raw.read(wanted)
-            except IOError as e:
-                if e.errno != EINTR:
-                    raise
+            except InterruptedError:
                 continue
             if chunk in empty_values:
                 nodata_val = chunk
@@ -1007,9 +1002,7 @@ class BufferedReader(_BufferedIOMixin):
             while True:
                 try:
                     current = self.raw.read(to_read)
-                except IOError as e:
-                    if e.errno != EINTR:
-                        raise
+                except InterruptedError:
                     continue
                 break
             if current:
@@ -1120,9 +1113,7 @@ class BufferedWriter(_BufferedIOMixin):
             while self._write_buf:
                 try:
                     n = self.raw.write(self._write_buf)
-                except IOError as e:
-                    if e.errno != EINTR:
-                        raise
+                except InterruptedError:
                     continue
                 if n > len(self._write_buf) or n < 0:
                     raise IOError("write() returned incorrect number of bytes")
index e6998157499e1211505d56655afd1dd4f345a0e6..6d4bbbe309c3645f189f488de31c6ac29418d6c6 100644 (file)
@@ -54,7 +54,7 @@ import warnings
 
 import os
 from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, EINVAL, \
-     ENOTCONN, ESHUTDOWN, EINTR, EISCONN, EBADF, ECONNABORTED, EPIPE, EAGAIN, \
+     ENOTCONN, ESHUTDOWN, EISCONN, EBADF, ECONNABORTED, EPIPE, EAGAIN, \
      errorcode
 
 _DISCONNECTED = frozenset((ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED, EPIPE,
@@ -143,11 +143,8 @@ def poll(timeout=0.0, map=None):
 
         try:
             r, w, e = select.select(r, w, e, timeout)
-        except select.error as err:
-            if err.args[0] != EINTR:
-                raise
-            else:
-                return
+        except InterruptedError:
+            return
 
         for fd in r:
             obj = map.get(fd)
@@ -190,9 +187,7 @@ def poll2(timeout=0.0, map=None):
                 pollster.register(fd, flags)
         try:
             r = pollster.poll(timeout)
-        except select.error as err:
-            if err.args[0] != EINTR:
-                raise
+        except InterruptedError:
             r = []
         for fd, flags in r:
             obj = map.get(fd)
index c48718026ba0c9f4175b3b920e55130a25d74bca..5c26683bf34ff25d0dd9129023a964ccbcc6a576 100644 (file)
@@ -327,15 +327,12 @@ class ForkAwareLocal(threading.local):
 # Automatic retry after EINTR
 #
 
-def _eintr_retry(func, _errors=(EnvironmentError, select.error)):
+def _eintr_retry(func):
     @functools.wraps(func)
     def wrapped(*args, **kwargs):
         while True:
             try:
                 return func(*args, **kwargs)
-            except _errors as e:
-                # select.error has no `errno` attribute
-                if e.args[0] == errno.EINTR:
-                    continue
-                raise
+            except InterruptedError:
+                continue
     return wrapped
index 57150349a5363faca83dda5023ceb681955046d5..b2954b5a877660671e41a87f9d783894ef377f93 100644 (file)
@@ -53,7 +53,6 @@ try:
 except ImportError:
     errno = None
 EBADF = getattr(errno, 'EBADF', 9)
-EINTR = getattr(errno, 'EINTR', 4)
 EAGAIN = getattr(errno, 'EAGAIN', 11)
 EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11)
 
@@ -280,11 +279,10 @@ class SocketIO(io.RawIOBase):
             except timeout:
                 self._timeout_occurred = True
                 raise
+            except InterruptedError:
+                continue
             except error as e:
-                n = e.args[0]
-                if n == EINTR:
-                    continue
-                if n in _blocking_errnos:
+                if e.args[0] in _blocking_errnos:
                     return None
                 raise
 
index 2c5c888910c32177a8ca24d8862204a9aa4fe876..a0aadb91a23b8fd780aa8a8ae933a1d713da6bf5 100644 (file)
@@ -450,10 +450,8 @@ def _eintr_retry_call(func, *args):
     while True:
         try:
             return func(*args)
-        except (OSError, IOError) as e:
-            if e.errno == errno.EINTR:
-                continue
-            raise
+        except InterruptedError:
+            continue
 
 
 def call(*popenargs, timeout=None, **kwargs):
index 3d3dd0b65a3ed1f2eee9da1df1b5619fef1b7770..d7a521c1cea95bcfe89914d9f0d497c5719702ba 100644 (file)
@@ -3584,7 +3584,7 @@ class FileObjectInterruptedTestCase(unittest.TestCase):
 
     @staticmethod
     def _raise_eintr():
-        raise socket.error(errno.EINTR)
+        raise socket.error(errno.EINTR, "interrupted")
 
     def _textiowrap_mock_socket(self, mock, buffering=-1):
         raw = socket.SocketIO(mock, "r")