summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/Topics.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2006-10-20 14:11:37 +0000
committerBenoit Foucher <benoit@zeroc.com>2006-10-20 14:11:37 +0000
commit12d2c541faa3f6a4db3ba58e7f9c8f9c03f947e8 (patch)
tree342dbb435f37e4f64fd1c515fc14fa17cf0e4639 /cpp/src/IceGrid/Topics.cpp
parentFix (diff)
downloadice-12d2c541faa3f6a4db3ba58e7f9c8f9c03f947e8.tar.bz2
ice-12d2c541faa3f6a4db3ba58e7f9c8f9c03f947e8.tar.xz
ice-12d2c541faa3f6a4db3ba58e7f9c8f9c03f947e8.zip
Observer fixes
Diffstat (limited to 'cpp/src/IceGrid/Topics.cpp')
-rw-r--r--cpp/src/IceGrid/Topics.cpp22
1 files changed, 19 insertions, 3 deletions
diff --git a/cpp/src/IceGrid/Topics.cpp b/cpp/src/IceGrid/Topics.cpp
index 20159fe4ec6..582a5f5da5b 100644
--- a/cpp/src/IceGrid/Topics.cpp
+++ b/cpp/src/IceGrid/Topics.cpp
@@ -50,11 +50,24 @@ ObserverTopic::subscribe(const Ice::ObjectPrx& obsv, const string& name)
{
return;
}
-
+
+ //
+ // We need to ensure that this observer isn't already registered
+ // as IceStorm might otherwise replace a previous subscriber
+ // without any notification.
+ //
+ assert(obsv);
+ if(_subscribers.find(obsv->ice_getIdentity()) != _subscribers.end())
+ {
+ throw ObserverAlreadyRegisteredException(obsv->ice_getIdentity());
+ }
+
IceStorm::QoS qos;
qos["reliability"] = "twoway ordered";
initObserver(_topic->subscribe(qos, obsv));
+ _subscribers.insert(obsv->ice_getIdentity());
+
if(!name.empty())
{
assert(_syncSubscribers.find(name) == _syncSubscribers.end());
@@ -72,6 +85,9 @@ ObserverTopic::unsubscribe(const Ice::ObjectPrx& observer, const string& name)
_topic->unsubscribe(observer);
}
+ assert(observer);
+ _subscribers.erase(observer->ice_getIdentity());
+
if(!name.empty())
{
assert(_syncSubscribers.find(name) != _syncSubscribers.end());
@@ -358,7 +374,7 @@ NodeObserverTopic::updateServer(const string& node, const ServerDynamicInfo& ser
{
if(p->id == server.id)
{
- if(server.state == Destroyed || server.state == Inactive)
+ if(server.state == Destroyed || (server.state == Inactive && server.enabled))
{
servers.erase(p);
}
@@ -370,7 +386,7 @@ NodeObserverTopic::updateServer(const string& node, const ServerDynamicInfo& ser
}
++p;
}
- if(server.state != Destroyed && server.state != Inactive && p == servers.end())
+ if(server.state != Destroyed && (server.state != Inactive || !server.enabled) && p == servers.end())
{
servers.push_back(server);
}