Release all forwarded functions in .close. Fixes #1513223.

This commit is contained in:
Martin v. Löwis 2006-07-01 15:33:37 +00:00
parent a09803329c
commit 7596e8342e
3 changed files with 34 additions and 14 deletions

View file

@ -130,35 +130,37 @@ _socketmethods = (
if sys.platform == "riscos":
_socketmethods = _socketmethods + ('sleeptaskw',)
# All the method names that must be delegated to either the real socket
# object or the _closedsocket object.
_delegate_methods = ("recv", "recvfrom", "recv_into", "recvfrom_into",
"send", "sendto")
class _closedsocket(object):
__slots__ = []
def _dummy(*args):
raise error(EBADF, 'Bad file descriptor')
send = recv = sendto = recvfrom = __getattr__ = _dummy
# All _delegate_methods must also be initialized here.
send = recv = recv_into = sendto = recvfrom = recvfrom_into = _dummy
__getattr__ = _dummy
class _socketobject(object):
__doc__ = _realsocket.__doc__
__slots__ = ["_sock",
"recv", "recv_into", "recvfrom_into",
"send", "sendto", "recvfrom",
"__weakref__"]
__slots__ = ["_sock", "__weakref__"] + list(_delegate_methods)
def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
if _sock is None:
_sock = _realsocket(family, type, proto)
self._sock = _sock
self.send = self._sock.send
self.recv = self._sock.recv
self.recv_into = self._sock.recv_into
self.sendto = self._sock.sendto
self.recvfrom = self._sock.recvfrom
self.recvfrom_into = self._sock.recvfrom_into
for method in _delegate_methods:
setattr(self, method, getattr(_sock, method))
def close(self):
self._sock = _closedsocket()
self.send = self.recv = self.sendto = self.recvfrom = self._sock._dummy
dummy = self._sock._dummy
for method in _delegate_methods:
setattr(self, method, dummy)
close.__doc__ = _realsocket.close.__doc__
def accept(self):