summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/SessionManager.h
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2006-09-12 09:01:35 +0000
committerBenoit Foucher <benoit@zeroc.com>2006-09-12 09:01:35 +0000
commitd89514da858be06f7e44129bcd6675a46181208e (patch)
tree662073ca1e8a9b6e56e9914087da66a824b88d6c /cpp/src/IceGrid/SessionManager.h
parentMinor Makefile tweak. (diff)
downloadice-d89514da858be06f7e44129bcd6675a46181208e.tar.bz2
ice-d89514da858be06f7e44129bcd6675a46181208e.tar.xz
ice-d89514da858be06f7e44129bcd6675a46181208e.zip
Fixes
Diffstat (limited to 'cpp/src/IceGrid/SessionManager.h')
-rw-r--r--cpp/src/IceGrid/SessionManager.h29
1 files changed, 26 insertions, 3 deletions
diff --git a/cpp/src/IceGrid/SessionManager.h b/cpp/src/IceGrid/SessionManager.h
index da7b837cb2b..fc358d19a87 100644
--- a/cpp/src/IceGrid/SessionManager.h
+++ b/cpp/src/IceGrid/SessionManager.h
@@ -28,6 +28,7 @@ class SessionKeepAliveThread : public IceUtil::Thread, public IceUtil::Monitor<I
Disconnected,
Connected,
Retry,
+ DestroySession,
Destroyed
};
@@ -46,6 +47,7 @@ public:
FPrx factory = _factory;
bool updateState = false;
IceUtil::Time timeout = IceUtil::Time::seconds(10);
+ bool destroy = false;
while(true)
{
@@ -116,9 +118,9 @@ public:
{
Lock sync(*this);
- if(_state != Destroyed && _state != Retry)
+ if(_state == Connected || _state == Disconnected)
{
- timedWait(timeout); // TODO: XXX: Timeout / 2 instead?
+ timedWait(timeout);
}
if(_state == Destroyed)
@@ -126,9 +128,22 @@ public:
break;
}
- updateState = _state == Retry;
+ if(_state == DestroySession && session)
+ {
+ destroy = true;
+ }
+
+ updateState = _state == Retry || _state == DestroySession;
factory = _factory;
}
+
+ if(destroy)
+ {
+ assert(session);
+ destroySession(session);
+ destroy = false;
+ session = 0;
+ }
}
//
@@ -184,6 +199,14 @@ public:
}
void
+ destroyActiveSession()
+ {
+ Lock sync(*this);
+ _state = DestroySession;
+ notifyAll();
+ }
+
+ void
terminate()
{
Lock sync(*this);