summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/ReplicaSessionI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/IceGrid/ReplicaSessionI.cpp')
-rw-r--r--cpp/src/IceGrid/ReplicaSessionI.cpp31
1 files changed, 23 insertions, 8 deletions
diff --git a/cpp/src/IceGrid/ReplicaSessionI.cpp b/cpp/src/IceGrid/ReplicaSessionI.cpp
index 1fb589470a2..6de154a0ee5 100644
--- a/cpp/src/IceGrid/ReplicaSessionI.cpp
+++ b/cpp/src/IceGrid/ReplicaSessionI.cpp
@@ -97,15 +97,30 @@ ReplicaSessionI::getTimeout(const Ice::Current& current) const
void
ReplicaSessionI::setDatabaseObserver(const DatabaseObserverPrx& observer, const Ice::Current& current)
{
- Lock sync(*this);
- if(_destroy)
+ int serialApplicationObserver;
+ int serialAdapterObserver;
+ int serialObjectObserver;
+
+ const ObserverTopicPtr applicationObserver = _database->getObserverTopic(ApplicationObserverTopicName);
+ const ObserverTopicPtr adapterObserver = _database->getObserverTopic(AdapterObserverTopicName);
+ const ObserverTopicPtr objectObserver = _database->getObserverTopic(ObjectObserverTopicName);
+
{
- throw Ice::ObjectNotExistException(__FILE__, __LINE__);
- }
- _observer = observer;
- _database->getObserverTopic(ApplicationObserverTopicName)->subscribe(_observer, _info->name);
- _database->getObserverTopic(AdapterObserverTopicName)->subscribe(_observer, _info->name);
- _database->getObserverTopic(ObjectObserverTopicName)->subscribe(_observer, _info->name);
+ Lock sync(*this);
+ if(_destroy)
+ {
+ throw Ice::ObjectNotExistException(__FILE__, __LINE__);
+ }
+ _observer = observer;
+
+ serialApplicationObserver = applicationObserver->subscribe(_observer, _info->name);
+ serialAdapterObserver = adapterObserver->subscribe(_observer, _info->name);
+ serialObjectObserver = objectObserver->subscribe(_observer, _info->name);
+ }
+
+ applicationObserver->waitForSyncedSubscribers(serialApplicationObserver, _info->name);
+ adapterObserver->waitForSyncedSubscribers(serialAdapterObserver, _info->name);
+ objectObserver->waitForSyncedSubscribers(serialObjectObserver, _info->name);
}
void