Index: Lib/socket.py =================================================================== --- Lib/socket.py (revision 67444) +++ Lib/socket.py (working copy) @@ -202,6 +202,7 @@ raise ValueError("invalid mode: %r" % mode) io.RawIOBase.__init__(self) self._sock = sock + self._fileno = self._sock.fileno() if "b" not in mode: mode += "b" self._mode = mode @@ -225,11 +226,11 @@ return self._writing and not self.closed def fileno(self): - return self._sock.fileno() + return self._fileno @property def name(self): - return self._sock.fileno() + return self._fileno @property def mode(self): @@ -238,12 +239,13 @@ def close(self): if self.closed: return + # http://bugs.python.org/issue3826 - Closed SocketIO's from makefile() + # should not prevent the underlying socket from being closed. + self._sock._decref_socketios() + del self._sock io.RawIOBase.close(self) - def __del__(self): - self._sock._decref_socketios() - def getfqdn(name=''): """Get fully qualified domain name from name. Index: Lib/test/test_socket.py =================================================================== --- Lib/test/test_socket.py (revision 67444) +++ Lib/test/test_socket.py (working copy) @@ -881,6 +881,29 @@ self.cli_file.write(b"B. " + MSG) self.cli_file.flush() + def testMakefileClose(self): + # The file returned by makefile should keep the socket open... + self.cli_conn.close() + msg = self.cli_conn.recv(1024) + self.assertEqual(msg, MSG) + # ...until the file is itself closed + self.serv_file.close() + self.assertRaises(socket.error, self.cli_conn.recv, 1024) + + def _testMakefileClose(self): + self.cli_file.write(MSG) + self.cli_file.flush() + + def testMakefileCloseSocketDestroy(self): + refcount_before = sys.getrefcount(self.cli_conn) + self.serv_file.close() + refcount_after = sys.getrefcount(self.cli_conn) + self.assertEqual(refcount_before - 1, refcount_after) + + def _testMakefileCloseSocketDestroy(self): + pass + + class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase): bufsize = 1 # Default-buffered for reading; line-buffered for writing