diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2009-03-26 11:34:24 -0230 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2009-03-26 11:34:24 -0230 |
commit | 0de45cd71fa21bcb20b8a3f754ff20cdf329ff23 (patch) | |
tree | 06c0fd3304362d39a56df0a234e90b3f84687edc /cpp/src | |
parent | More fixes to FixUtil.py (diff) | |
download | ice-0de45cd71fa21bcb20b8a3f754ff20cdf329ff23.tar.bz2 ice-0de45cd71fa21bcb20b8a3f754ff20cdf329ff23.tar.xz ice-0de45cd71fa21bcb20b8a3f754ff20cdf329ff23.zip |
Bug 2511 - add default servants
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.cpp | 30 | ||||
-rw-r--r-- | cpp/src/Ice/ObjectAdapterI.h | 4 | ||||
-rw-r--r-- | cpp/src/Ice/ServantManager.cpp | 82 | ||||
-rw-r--r-- | cpp/src/Ice/ServantManager.h | 6 |
4 files changed, 121 insertions, 1 deletions
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp index 897ef753181..22832b15ac0 100644 --- a/cpp/src/Ice/ObjectAdapterI.cpp +++ b/cpp/src/Ice/ObjectAdapterI.cpp @@ -407,6 +407,16 @@ Ice::ObjectAdapterI::addFacetWithUUID(const ObjectPtr& object, const string& fac return addFacet(object, ident, facet); } +void +Ice::ObjectAdapterI::addDefaultServant(const ObjectPtr& servant, const string& category) +{ + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + + checkForDeactivation(); + + _servantManager->addDefaultServant(servant, category); +} + ObjectPtr Ice::ObjectAdapterI::remove(const Identity& ident) { @@ -436,6 +446,16 @@ Ice::ObjectAdapterI::removeAllFacets(const Identity& ident) } ObjectPtr +Ice::ObjectAdapterI::removeDefaultServant(const string& category) +{ + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + + checkForDeactivation(); + + return _servantManager->removeDefaultServant(category); +} + +ObjectPtr Ice::ObjectAdapterI::find(const Identity& ident) const { return findFacet(ident, ""); @@ -474,6 +494,16 @@ Ice::ObjectAdapterI::findByProxy(const ObjectPrx& proxy) const return findFacet(ref->getIdentity(), ref->getFacet()); } +ObjectPtr +Ice::ObjectAdapterI::findDefaultServant(const string& category) const +{ + IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this); + + checkForDeactivation(); + + return _servantManager->findDefaultServant(category); +} + void Ice::ObjectAdapterI::addServantLocator(const ServantLocatorPtr& locator, const string& prefix) { diff --git a/cpp/src/Ice/ObjectAdapterI.h b/cpp/src/Ice/ObjectAdapterI.h index 58b2830e13f..5985dac062a 100644 --- a/cpp/src/Ice/ObjectAdapterI.h +++ b/cpp/src/Ice/ObjectAdapterI.h @@ -56,13 +56,17 @@ public: virtual ObjectPrx addFacet(const ObjectPtr&, const Identity&, const std::string&); virtual ObjectPrx addWithUUID(const ObjectPtr&); virtual ObjectPrx addFacetWithUUID(const ObjectPtr&, const std::string&); + virtual void addDefaultServant(const ObjectPtr&, const std::string&); virtual ObjectPtr remove(const Identity&); virtual ObjectPtr removeFacet(const Identity&, const std::string&); virtual FacetMap removeAllFacets(const Identity&); + virtual ObjectPtr removeDefaultServant(const std::string&); virtual ObjectPtr find(const Identity&) const; virtual ObjectPtr findFacet(const Identity&, const std::string&) const; virtual FacetMap findAllFacets(const Identity&) const; virtual ObjectPtr findByProxy(const ObjectPrx&) const; + virtual ObjectPtr findDefaultServant(const std::string&) const; + virtual void addServantLocator(const ServantLocatorPtr&, const std::string&); virtual ServantLocatorPtr findServantLocator(const std::string&) const; diff --git a/cpp/src/Ice/ServantManager.cpp b/cpp/src/Ice/ServantManager.cpp index 743f0bdb6b9..6562896ae0a 100644 --- a/cpp/src/Ice/ServantManager.cpp +++ b/cpp/src/Ice/ServantManager.cpp @@ -58,6 +58,25 @@ IceInternal::ServantManager::addServant(const ObjectPtr& object, const Identity& p->second.insert(pair<const string, ObjectPtr>(facet, object)); } +void +IceInternal::ServantManager::addDefaultServant(const ObjectPtr& object, const string& category) +{ + IceUtil::Mutex::Lock sync(*this); + + assert(_instance); // Must not be called after destruction. + + DefaultServantMap::iterator p = _defaultServantMap.find(category); + if(p != _defaultServantMap.end()) + { + AlreadyRegisteredException ex(__FILE__, __LINE__); + ex.kindOfObject = "default servant"; + ex.id = category; + throw ex; + } + + _defaultServantMap.insert(pair<const string, ObjectPtr>(category, object)); +} + ObjectPtr IceInternal::ServantManager::removeServant(const Identity& ident, const string& facet) { @@ -110,6 +129,35 @@ IceInternal::ServantManager::removeServant(const Identity& ident, const string& return servant; } +ObjectPtr +IceInternal::ServantManager::removeDefaultServant(const string& category) +{ + // + // We return the removed servant to avoid releasing the last reference count + // with *this locked. We don't want to run user code, such as the servant + // destructor, with an internal Ice mutex locked. + // + ObjectPtr servant = 0; + + IceUtil::Mutex::Lock sync(*this); + + assert(_instance); // Must not be called after destruction. + + DefaultServantMap::iterator p = _defaultServantMap.find(category); + if(p == _defaultServantMap.end()) + { + NotRegisteredException ex(__FILE__, __LINE__); + ex.kindOfObject = "default servant"; + ex.id = category; + throw ex; + } + + servant = p->second; + _defaultServantMap.erase(p); + + return servant; +} + FacetMap IceInternal::ServantManager::removeAllFacets(const Identity& ident) { @@ -172,7 +220,23 @@ IceInternal::ServantManager::findServant(const Identity& ident, const string& fa if(p == servantMapMap.end() || (q = p->second.find(facet)) == p->second.end()) { - return 0; + DefaultServantMap::const_iterator p = _defaultServantMap.find(ident.category); + if(p == _defaultServantMap.end()) + { + p = _defaultServantMap.find(""); + if(p == _defaultServantMap.end()) + { + return 0; + } + else + { + return p->second; + } + } + else + { + return p->second; + } } else { @@ -181,6 +245,22 @@ IceInternal::ServantManager::findServant(const Identity& ident, const string& fa } } +ObjectPtr +IceInternal::ServantManager::findDefaultServant(const string& category) const +{ + IceUtil::Mutex::Lock sync(*this); + + DefaultServantMap::const_iterator p = _defaultServantMap.find(category); + if(p == _defaultServantMap.end()) + { + return 0; + } + else + { + return p->second; + } +} + FacetMap IceInternal::ServantManager::findAllFacets(const Identity& ident) const { diff --git a/cpp/src/Ice/ServantManager.h b/cpp/src/Ice/ServantManager.h index a06d050fa71..2cb1134e2e9 100644 --- a/cpp/src/Ice/ServantManager.h +++ b/cpp/src/Ice/ServantManager.h @@ -33,9 +33,12 @@ class ServantManager : public IceUtil::Shared, public IceUtil::Mutex public: void addServant(const Ice::ObjectPtr&, const Ice::Identity&, const std::string&); + void addDefaultServant(const Ice::ObjectPtr&, const std::string&); Ice::ObjectPtr removeServant(const Ice::Identity&, const std::string&); + Ice::ObjectPtr removeDefaultServant(const std::string&); Ice::FacetMap removeAllFacets(const Ice::Identity&); Ice::ObjectPtr findServant(const Ice::Identity&, const std::string&) const; + Ice::ObjectPtr findDefaultServant(const std::string&) const; Ice::FacetMap findAllFacets(const Ice::Identity&) const; bool hasServant(const Ice::Identity&) const; @@ -54,10 +57,13 @@ private: const std::string _adapterName; typedef std::map<Ice::Identity, Ice::FacetMap> ServantMapMap; + typedef std::map<std::string, Ice::ObjectPtr> DefaultServantMap; ServantMapMap _servantMapMap; mutable ServantMapMap::iterator _servantMapMapHint; + DefaultServantMap _defaultServantMap; + std::map<std::string, Ice::ServantLocatorPtr> _locatorMap; mutable std::map<std::string, Ice::ServantLocatorPtr>::iterator _locatorMapHint; }; |