From 61f7d1047fd34d33fa70297cae646dc6dc6f9023 Mon Sep 17 00:00:00 2001 From: Ben Darnell Date: Sun, 27 Sep 2015 20:23:56 -0400 Subject: [PATCH] Handle EINTR in IOStream. Fixes #1287 --- tornado/iostream.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/tornado/iostream.py b/tornado/iostream.py index 1e6771045..0bad0acd6 100644 --- a/tornado/iostream.py +++ b/tornado/iostream.py @@ -725,18 +725,22 @@ class BaseIOStream(object): to read (i.e. the read returns EWOULDBLOCK or equivalent). On error closes the socket and raises an exception. """ - try: - chunk = self.read_from_fd() - except (socket.error, IOError, OSError) as e: - # ssl.SSLError is a subclass of socket.error - if self._is_connreset(e): - # Treat ECONNRESET as a connection close rather than - # an error to minimize log spam (the exception will - # be available on self.error for apps that care). + while True: + try: + chunk = self.read_from_fd() + except (socket.error, IOError, OSError) as e: + if errno_from_exception(e) == errno.EINTR: + continue + # ssl.SSLError is a subclass of socket.error + if self._is_connreset(e): + # Treat ECONNRESET as a connection close rather than + # an error to minimize log spam (the exception will + # be available on self.error for apps that care). + self.close(exc_info=True) + return self.close(exc_info=True) - return - self.close(exc_info=True) - raise + raise + break if chunk is None: return 0 self._read_buffer.append(chunk) -- 2.47.3