diff options
author | Benoit Foucher <benoit@zeroc.com> | 2007-08-30 16:15:46 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2007-08-30 16:15:46 +0200 |
commit | 90679336bd9c0abddfdcfc037b58a3fbe8299fbf (patch) | |
tree | 578692481f64bf0f1b1d76351b395dfbcf52a708 /cpp/src/Ice/ConnectionMonitor.cpp | |
parent | bug 2424: check for null in Java hashCode method (diff) | |
download | ice-90679336bd9c0abddfdcfc037b58a3fbe8299fbf.tar.bz2 ice-90679336bd9c0abddfdcfc037b58a3fbe8299fbf.tar.xz ice-90679336bd9c0abddfdcfc037b58a3fbe8299fbf.zip |
Squashed commit of the following:
commit a61fce80c95ed97d9716648c2083c8581326e950
Author: Benoit Foucher <benoit@zeroc.com>
Date: Thu Aug 30 15:33:54 2007 +0200
Added optimization to not wakeup too often
commit d44134e724e43aeb1db8693a37a5b611f295948c
Author: Benoit Foucher <benoit@zeroc.com>
Date: Thu Aug 30 11:34:22 2007 +0200
Changed the connection monitor to use the timer.
commit 915f0669599a457f46974c3a108205d5c3c666ba
Author: Benoit Foucher <benoit@zeroc.com>
Date: Wed Aug 29 16:18:59 2007 +0200
Fixed IceGrid and casino demo to use IceUtil::Timer
Diffstat (limited to 'cpp/src/Ice/ConnectionMonitor.cpp')
-rw-r--r-- | cpp/src/Ice/ConnectionMonitor.cpp | 104 |
1 files changed, 51 insertions, 53 deletions
diff --git a/cpp/src/Ice/ConnectionMonitor.cpp b/cpp/src/Ice/ConnectionMonitor.cpp index 1be8a4f374e..cf4104e805d 100644 --- a/cpp/src/Ice/ConnectionMonitor.cpp +++ b/cpp/src/Ice/ConnectionMonitor.cpp @@ -22,23 +22,17 @@ IceUtil::Shared* IceInternal::upCast(ConnectionMonitor* p) { return p; } void IceInternal::ConnectionMonitor::destroy() { - { - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - - assert(_instance); - _instance = 0; - _connections.clear(); + IceUtil::Mutex::Lock sync(*this); - notify(); - } - - getThreadControl().join(); + assert(_instance); + _instance = 0; + _connections.clear(); } void IceInternal::ConnectionMonitor::add(const ConnectionIPtr& connection) { - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + IceUtil::Mutex::Lock sync(*this); assert(_instance); _connections.insert(connection); } @@ -46,17 +40,26 @@ IceInternal::ConnectionMonitor::add(const ConnectionIPtr& connection) void IceInternal::ConnectionMonitor::remove(const ConnectionIPtr& connection) { - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); + IceUtil::Mutex::Lock sync(*this); assert(_instance); _connections.erase(connection); } IceInternal::ConnectionMonitor::ConnectionMonitor(const InstancePtr& instance, int interval) : - _instance(instance), - _interval(IceUtil::Time::seconds(interval)) + _instance(instance) { assert(interval > 0); - start(); + __setNoDelete(true); + try + { + instance->timer()->scheduleRepeated(this, IceUtil::Time::seconds(interval)); + } + catch(...) + { + __setNoDelete(false); + throw; + } + __setNoDelete(false); } IceInternal::ConnectionMonitor::~ConnectionMonitor() @@ -68,55 +71,50 @@ IceInternal::ConnectionMonitor::~ConnectionMonitor() void IceInternal::ConnectionMonitor::run() { - while(true) + set<ConnectionIPtr> connections; + { - set<ConnectionIPtr> connections; - + IceUtil::Mutex::Lock sync(*this); + if(!_instance) { - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(_instance && !timedWait(_interval)) - { - connections = _connections; - } + return; + } + connections = _connections; + } + + + // + // Monitor connections outside the thread synchronization, so + // that connections can be added or removed during monitoring. + // + for(set<ConnectionIPtr>::const_iterator p = connections.begin(); p != connections.end(); ++p) + { + try + { + (*p)->monitor(); + } + catch(const Exception& ex) + { + IceUtil::Mutex::Lock sync(*this); if(!_instance) { return; } + + Error out(_instance->initializationData().logger); + out << "exception in connection monitor:\n" << ex; } - - // - // Monitor connections outside the thread synchronization, so - // that connections can be added or removed during monitoring. - // - for(set<ConnectionIPtr>::const_iterator p = connections.begin(); p != connections.end(); ++p) + catch(...) { - try - { - (*p)->monitor(); - } - catch(const Exception& ex) - { - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - return; - } - - Error out(_instance->initializationData().logger); - out << "exception in connection monitor:\n" << ex; - } - catch(...) + IceUtil::Mutex::Lock sync(*this); + if(!_instance) { - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this); - if(!_instance) - { - return; - } - - Error out(_instance->initializationData().logger); - out << "unknown exception in connection monitor"; + return; } + + Error out(_instance->initializationData().logger); + out << "unknown exception in connection monitor"; } } } |