[Python-Dev] socket._socketobject.close() doesn't really close sockets
Bruce Christensen
t-bruch at microsoft.com
Tue Jun 13 01:47:02 CEST 2006
In implementing the IronPython _socket module, I've discovered some
puzzling behavior in the standard Python socket wrapper module:
socket._socketobject.close() doesn't actually close sockets; rather, it
just sets _sock to an instance of _closedsocket and lets the GC clean up
the real socket. (See socket.py around line 160.)
This works fine with a reference counting GC, but can potentially leave
sockets hanging around for a long time on platforms (e.g. the CLR) with
other GC algorithms. It causes most of the socket unit tests to fail on
IronPython.
Is there a reason for this implementation?
This patch to _socketobject.close() makes socket.py work with
IronPython:
def close(self):
+ if not isinstance(self._sock, _closedsocket):
+ self._sock.close()
self._sock = _closedsocket()
self.send = self.recv = self.sendto = self.recvfrom =
self._sock._dummy
--Bruce
More information about the Python-Dev
mailing list