diff options
Diffstat (limited to 'cpp/src/IceGrid/ReapThread.cpp')
-rw-r--r-- | cpp/src/IceGrid/ReapThread.cpp | 64 |
1 files changed, 42 insertions, 22 deletions
diff --git a/cpp/src/IceGrid/ReapThread.cpp b/cpp/src/IceGrid/ReapThread.cpp index 1a41eba89c4..7a312c8dbe6 100644 --- a/cpp/src/IceGrid/ReapThread.cpp +++ b/cpp/src/IceGrid/ReapThread.cpp @@ -22,49 +22,66 @@ ReapThread::ReapThread(int timeout) : void ReapThread::run() { - Lock sync(*this); - - while(!_terminated) + vector<ReapablePtr> reap; + while(true) { - list<ReapablePtr>::iterator p = _sessions.begin(); - while(p != _sessions.end()) { - try + Lock sync(*this); + if(_terminated) + { + break; + } + + timedWait(_timeout); + + list<ReapablePtr>::iterator p = _sessions.begin(); + while(p != _sessions.end()) { - if((IceUtil::Time::now() - (*p)->timestamp()) > _timeout) + try { - try + if((IceUtil::Time::now() - (*p)->timestamp()) > _timeout) { - (*p)->destroy(); + reap.push_back(*p); + p = _sessions.erase(p); } - catch(const Ice::LocalException&) + else { + ++p; } - p = _sessions.erase(p); } - else + catch(const Ice::ObjectNotExistException&) { - ++p; + p = _sessions.erase(p); } } - catch(const Ice::ObjectNotExistException&) + } + + for(vector<ReapablePtr>::const_iterator p = reap.begin(); p != reap.end(); ++p) + { + try + { + (*p)->destroy(); + } + catch(const Ice::LocalException&) { - p = _sessions.erase(p); } } - - timedWait(_timeout); + reap.clear(); } } void ReapThread::terminate() { - Lock sync(*this); - - _terminated = true; - notify(); + { + Lock sync(*this); + _terminated = true; + notify(); + } + // + // _sessions is immutable once the reap thread is terminated. + // for(list<ReapablePtr>::const_iterator p = _sessions.begin(); p != _sessions.end(); ++p) { try @@ -76,7 +93,6 @@ ReapThread::terminate() // Ignore. } } - _sessions.clear(); } @@ -84,6 +100,10 @@ void ReapThread::add(const ReapablePtr& reapable) { Lock sync(*this); + if(_terminated) + { + return; + } _sessions.push_back(reapable); } |