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
_______________________________________________
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com