From: Ben Darnell Date: Sun, 15 May 2011 04:18:11 +0000 (-0700) Subject: Freeze the iostream write buffer when send() returns 0. X-Git-Tag: v2.0.0~81 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5f953f6f0bc5f15699c8d7c9e0e2ae5993d67826;p=thirdparty%2Ftornado.git Freeze the iostream write buffer when send() returns 0. --- diff --git a/tornado/iostream.py b/tornado/iostream.py index 812d5f6dc..3a9efcfef 100644 --- a/tornado/iostream.py +++ b/tornado/iostream.py @@ -357,21 +357,24 @@ class IOStream(object): # with more than 128KB at a time. _merge_prefix(self._write_buffer, 128 * 1024) num_bytes = self.socket.send(self._write_buffer[0]) - self._write_buffer_frozen = False - _merge_prefix(self._write_buffer, num_bytes) - self._write_buffer.popleft() - except socket.error, e: - if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN): - # With OpenSSL, after send returns EWOULDBLOCK, + if num_bytes == 0: + # With OpenSSL, if we couldn't write the entire buffer, # the very same string object must be used on the # next call to send. Therefore we suppress - # merging the write buffer after an EWOULDBLOCK. + # merging the write buffer after an incomplete send. # A cleaner solution would be to set # SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER, but this is # not yet accessible from python # (http://bugs.python.org/issue8240) self._write_buffer_frozen = True break + self._write_buffer_frozen = False + _merge_prefix(self._write_buffer, num_bytes) + self._write_buffer.popleft() + except socket.error, e: + if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN): + self._write_buffer_frozen = True + break else: logging.warning("Write error on %d: %s", self.socket.fileno(), e)