summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ConnectionMonitor.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2007-08-30 16:15:46 +0200
committerBenoit Foucher <benoit@zeroc.com>2007-08-30 16:15:46 +0200
commit90679336bd9c0abddfdcfc037b58a3fbe8299fbf (patch)
tree578692481f64bf0f1b1d76351b395dfbcf52a708 /cpp/src/Ice/ConnectionMonitor.cpp
parentbug 2424: check for null in Java hashCode method (diff)
downloadice-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.cpp104
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";
}
}
}