diff options
author | Benoit Foucher <benoit@zeroc.com> | 2006-10-20 14:11:37 +0000 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2006-10-20 14:11:37 +0000 |
commit | 12d2c541faa3f6a4db3ba58e7f9c8f9c03f947e8 (patch) | |
tree | 342dbb435f37e4f64fd1c515fc14fa17cf0e4639 /cpp/src/IceGrid/Topics.cpp | |
parent | Fix (diff) | |
download | ice-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.cpp | 22 |
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); } |