summaryrefslogtreecommitdiff
path: root/python/qpid/session.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/qpid/session.py')
-rw-r--r--python/qpid/session.py44
1 files changed, 26 insertions, 18 deletions
diff --git a/python/qpid/session.py b/python/qpid/session.py
index f8ac98b96e..a1103e0428 100644
--- a/python/qpid/session.py
+++ b/python/qpid/session.py
@@ -52,7 +52,8 @@ class Session(Invoker):
self.timeout = timeout
self.channel = None
self.invoke_lock = Lock()
- self.closed = False
+ self._closing = False
+ self._closed = False
self.condition = Condition()
@@ -82,7 +83,9 @@ class Session(Invoker):
def error(self):
exc = self.exceptions[:]
- if len(exc) == 1:
+ if len(exc) == 0:
+ return None
+ elif len(exc) == 1:
return exc[0]
else:
return tuple(exc)
@@ -102,13 +105,31 @@ class Session(Invoker):
def close(self, timeout=None):
self.invoke_lock.acquire()
try:
- self.closed = True
+ self._closing = True
self.channel.session_detach(self.name)
finally:
self.invoke_lock.release()
if not wait(self.condition, lambda: self.channel is None, timeout):
raise Timeout()
+ def closed(self):
+ self.lock.acquire()
+ try:
+ if self._closed: return
+ self._closed = True
+
+ error = self.error()
+ for id in self.results:
+ f = self.results[id]
+ f.error(error)
+ self.results.clear()
+
+ for q in self._incoming.values():
+ q.close(error)
+ notify(self.condition)
+ finally:
+ self.lock.release()
+
def resolve_method(self, name):
cmd = self.spec.instructions.get(name)
if cmd is not None and cmd.track == self.spec["track.command"].value:
@@ -136,7 +157,7 @@ class Session(Invoker):
self.invoke_lock.release()
def do_invoke(self, type, args, kwargs):
- if self.closed:
+ if self._closing:
raise SessionClosed()
if self.channel == None:
@@ -311,20 +332,7 @@ class Delegate:
future.set(er.value)
def execution_exception(self, ex):
- self.session.lock.acquire()
- try:
- self.session.exceptions.append(ex)
- error = self.session.error()
- for id in self.session.results:
- f = self.session.results[id]
- f.error(error)
- self.session.results.clear()
-
- for q in self.session._incoming.values():
- q.close(error)
- notify(self.session.condition)
- finally:
- self.session.lock.release()
+ self.session.exceptions.append(ex)
class Client(Delegate):