diff options
author | Giampaolo RodolĂ <g.rodola@gmail.com> | 2011-02-11 13:04:18 (GMT) |
---|---|---|
committer | Giampaolo RodolĂ <g.rodola@gmail.com> | 2011-02-11 13:04:18 (GMT) |
commit | 42e0b7f47ef3bd1fe3b20ae253c9f660092d2fa4 (patch) | |
tree | 85b0f6fa1367f3174eb7dee6635be83da93fd286 | |
parent | 2933312fe71f15d127009c872cd1e5f98a993999 (diff) | |
download | cpython-42e0b7f47ef3bd1fe3b20ae253c9f660092d2fa4.zip cpython-42e0b7f47ef3bd1fe3b20ae253c9f660092d2fa4.tar.gz cpython-42e0b7f47ef3bd1fe3b20ae253c9f660092d2fa4.tar.bz2 |
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.
-rw-r--r-- | Lib/asyncore.py | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/Lib/asyncore.py b/Lib/asyncore.py index f0712e2..91c629b 100644 --- a/Lib/asyncore.py +++ b/Lib/asyncore.py @@ -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. |