diff options
author | Gordon Sim <gsim@apache.org> | 2007-01-23 10:51:53 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2007-01-23 10:51:53 +0000 |
commit | 8e7b8d6ccc43a990d88ce582fbf0756981c00e96 (patch) | |
tree | 821fa8ba2ffb2a5258e4b069019b2db820da97ae | |
parent | f5c687099e8b214666a648d639a2965a99e3f961 (diff) | |
download | qpid-python-8e7b8d6ccc43a990d88ce582fbf0756981c00e96.tar.gz |
Proper fix to race condition where connection-close is sent by server. Now handle socket close on worker thread also.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@498983 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | python/qpid/peer.py | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/python/qpid/peer.py b/python/qpid/peer.py index ef913d6196..7c6cf91dea 100644 --- a/python/qpid/peer.py +++ b/python/qpid/peer.py @@ -71,7 +71,7 @@ class Peer: try: frame = self.conn.read() except EOF, e: - self.close(e) + self.work.close() break ch = self.channel(frame.channel) ch.dispatch(frame, self.work) @@ -100,6 +100,8 @@ class Peer: try: while True: self.dispatch(self.work.get()) + except QueueClosed, e: + self.close(e) except: self.fatal() @@ -127,22 +129,14 @@ class Channel: self.queue = None self.closed = False self.reason = None - #lock used to synchronise calls to close - self.lock = thread.allocate_lock() def close(self, reason): - self.lock.acquire() - try: - if isinstance(reason, Message): - self.reason = reason - if self.closed: - return - self.closed = True - self.reason = reason - self.incoming.close() - self.responses.close() - finally: - self.lock.release() + if self.closed: + return + self.closed = True + self.reason = reason + self.incoming.close() + self.responses.close() def dispatch(self, frame, work): payload = frame.payload |