asyncore: introduce a new 'closed' attribute to make sure that dispatcher gets closed only once.

In different occasions close() might be called more than once, causing problems with already disconnected sockets/dispatchers.
This commit is contained in:
Giampaolo Rodolà 2011-02-11 13:04:18 +00:00
parent 2933312fe7
commit 42e0b7f47e
1 changed files with 11 additions and 9 deletions

View File

@ -220,7 +220,7 @@ class dispatcher:
connected = False
accepting = False
closing = False
closed = False
addr = None
ignore_log_types = frozenset(['warning'])
@ -393,14 +393,16 @@ class dispatcher:
raise
def close(self):
self.connected = False
self.accepting = False
self.del_channel()
try:
self.socket.close()
except socket.error as why:
if why.args[0] not in (ENOTCONN, EBADF):
raise
if not self.closed:
self.closed = True
self.connected = False
self.accepting = False
self.del_channel()
try:
self.socket.close()
except socket.error as why:
if why.args[0] not in (ENOTCONN, EBADF):
raise
# cheap inheritance, used to pass all other attribute
# references to the underlying socket object.