diff --git a/Lib/_pyio.py b/Lib/_pyio.py index b6baa1a345..e597677a9b 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -552,10 +552,16 @@ class IOBase(metaclass=abc.ABCMeta): self.write(line) def register_buffer(self, buf): - """Used if a buffered I/O object wraps this object. The 'flush()' - method of 'buf' will be called before this object is closed. + """Register a buffered file object that is using this file object. + The 'flush()' method of 'buf' will be called before this object is + closed. """ + def deregister_buffer(self, buf): + """Deregister a buffered file object that is using this file object. + """ + pass + io.IOBase.register(IOBase) @@ -1187,8 +1193,8 @@ class BufferedWriter(_BufferedIOMixin): self.buffer_size = buffer_size self._write_buf = bytearray() self._write_lock = Lock() - if hasattr(self._raw, 'register_buffer'): - self._raw.register_buffer(self) + if hasattr(self.raw, 'register_buffer'): + self.raw.register_buffer(self) def writable(self): return self.raw.writable() @@ -1249,14 +1255,6 @@ class BufferedWriter(_BufferedIOMixin): raise OSError("write() returned incorrect number of bytes") del self._write_buf[:n] - def _flush_raw_closing(self): - # called when the underlying raw object is closing - try: - print('calling _flush_raw_closing') - self.flush() - except Exception: - pass - def tell(self): return _BufferedIOMixin.tell(self) + len(self._write_buf) @@ -1280,6 +1278,10 @@ class BufferedWriter(_BufferedIOMixin): self.flush() finally: with self._write_lock: + if hasattr(self.raw, 'deregister_buffer'): + # We must deregister ourselves otherwise calling + # self.raw.close() will cause a recursive lock issue. + self.raw.deregister_buffer(self) self.raw.close() @@ -1702,9 +1704,14 @@ class FileIO(RawIOBase): def register_buffer(self, buf): if self._writable: - print('register flush', buf) self._buffers.append(buf) + def deregister_buffer(self, buf): + try: + self._buffers.remove(buf) + except ValueError: + pass + def close(self): """Close the file. @@ -1713,9 +1720,7 @@ class FileIO(RawIOBase): """ if not self.closed: if self._buffers: - print('flushing buffers', self._buffers) for buf in self._buffers: - print('calling flush', buf) try: buf.flush() except Exception: