diff options
author | Benoit Foucher <benoit@zeroc.com> | 2009-03-25 12:44:32 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2009-03-25 12:44:32 +0100 |
commit | 1af6b5ee2872fe04c9185cf96f6bb9535506a782 (patch) | |
tree | 69be157019dcd71f0c599e389af18f4ad2d1fe56 /cpp/src/IceGrid/ServerI.cpp | |
parent | Fixed bug 3898 - bogus exit code for Freeze/transform Java clients (diff) | |
download | ice-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.cpp | 27 |
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&) { |