summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/ServerI.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2009-03-25 12:44:32 +0100
committerBenoit Foucher <benoit@zeroc.com>2009-03-25 12:44:32 +0100
commit1af6b5ee2872fe04c9185cf96f6bb9535506a782 (patch)
tree69be157019dcd71f0c599e389af18f4ad2d1fe56 /cpp/src/IceGrid/ServerI.cpp
parentFixed bug 3898 - bogus exit code for Freeze/transform Java clients (diff)
downloadice-1af6b5ee2872fe04c9185cf96f6bb9535506a782.tar.bz2
ice-1af6b5ee2872fe04c9185cf96f6bb9535506a782.tar.xz
ice-1af6b5ee2872fe04c9185cf96f6bb9535506a782.zip
Fixed bug 3230 - IceGrid node leak
Diffstat (limited to 'cpp/src/IceGrid/ServerI.cpp')
-rw-r--r--cpp/src/IceGrid/ServerI.cpp27
1 files changed, 24 insertions, 3 deletions
diff --git a/cpp/src/IceGrid/ServerI.cpp b/cpp/src/IceGrid/ServerI.cpp
index 6c1941f3ad5..901fc5eae30 100644
--- a/cpp/src/IceGrid/ServerI.cpp
+++ b/cpp/src/IceGrid/ServerI.cpp
@@ -1750,6 +1750,11 @@ ServerI::shutdown()
{
Lock sync(*this);
assert(_state == ServerI::Inactive);
+ assert(!_destroy);
+ assert(!_stop);
+ assert(!_load);
+ assert(!_patch);
+ assert(!_start);
_timerTask = 0;
}
@@ -2567,6 +2572,12 @@ ServerI::setStateNoSync(InternalServerState st, const std::string& reason)
break;
}
+ if(_timerTask)
+ {
+ _node->getTimer()->cancel(_timerTask);
+ _timerTask = 0;
+ }
+
if(_state == Destroyed && !_load)
{
//
@@ -2587,6 +2598,7 @@ ServerI::setStateNoSync(InternalServerState st, const std::string& reason)
{
if(_activation == Always)
{
+ assert(!_timerTask);
_timerTask = new DelayedStart(this, _node->getTraceLevels());
try
{
@@ -2606,12 +2618,21 @@ ServerI::setStateNoSync(InternalServerState st, const std::string& reason)
// server will be ready to be reactivated when the
// callback is executed.
//
+ assert(!_timerTask);
_timerTask = new DelayedStart(this, _node->getTraceLevels());
try
{
- _node->getTimer()->schedule(_timerTask,
- IceUtil::Time::seconds(_disableOnFailure) +
- IceUtil::Time::milliSeconds(500));
+ IceUtil::Time now = IceUtil::Time::now(IceUtil::Time::Monotonic);
+ if(now - _failureTime < IceUtil::Time::seconds(_disableOnFailure))
+ {
+ _node->getTimer()->schedule(_timerTask,
+ IceUtil::Time::seconds(_disableOnFailure) - now + _failureTime +
+ IceUtil::Time::milliSeconds(500));
+ }
+ else
+ {
+ _node->getTimer()->schedule(_timerTask, IceUtil::Time::milliSeconds(500));
+ }
}
catch(const IceUtil::Exception&)
{