]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Release memoryviews explicitly
authorAntoine Pitrou <antoine@python.org>
Sat, 21 Oct 2017 18:47:29 +0000 (20:47 +0200)
committerBen Darnell <ben@bendarnell.com>
Fri, 5 Jan 2018 03:11:35 +0000 (22:11 -0500)
See https://github.com/tornadoweb/tornado/pull/2008 for reasons why this
might be necessary.

tornado/iostream.py

index a1619c497415aa863246fd6dee364ee52f4fc973..784ef5e175072cdaefc506f661a57bab00df5b25 100644 (file)
@@ -83,6 +83,15 @@ if hasattr(errno, "WSAEINPROGRESS"):
     _ERRNO_INPROGRESS += (errno.WSAEINPROGRESS,)  # type: ignore
 
 _WINDOWS = sys.platform.startswith('win')
+_PY3 = sys.version_info[0] >= 3
+
+if _PY3:
+    # We'd like to release memoryviews explicitly, see
+    # https://github.com/tornadoweb/tornado/pull/2008
+    _release_memoryview = memoryview.release
+else:
+    def _release_memoryview(m):
+        pass
 
 
 class StreamClosedError(IOError):
@@ -858,8 +867,14 @@ class BaseIOStream(object):
                     size = 128 * 1024
                 else:
                     size = self._write_buffer_size
-                num_bytes = self.write_to_fd(
-                    memoryview(self._write_buffer)[start:start + size])
+                mem = memoryview(self._write_buffer)
+                mem2 = mem[start:start + size]
+                try:
+                    num_bytes = self.write_to_fd(mem2)
+                finally:
+                    _release_memoryview(mem2)
+                    _release_memoryview(mem)
+                    del mem, mem2
                 if num_bytes == 0:
                     self._got_empty_write(size)
                     break
@@ -907,9 +922,14 @@ class BaseIOStream(object):
             return b""
         assert loc <= self._read_buffer_size
         # Slice the bytearray buffer into bytes, without intermediate copying
-        b = (memoryview(self._read_buffer)
-             [self._read_buffer_pos:self._read_buffer_pos + loc]
-             ).tobytes()
+        mem = memoryview(self._read_buffer)
+        mem2 = mem[self._read_buffer_pos:self._read_buffer_pos + loc]
+        try:
+            b = mem2.tobytes()
+        finally:
+            _release_memoryview(mem2)
+            _release_memoryview(mem)
+            del mem, mem2
         self._read_buffer_pos += loc
         self._read_buffer_size -= loc
         # Amortized O(1) shrink