diff options
author | Jose <jose@zeroc.com> | 2009-08-12 00:34:01 +0200 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2009-08-12 00:34:01 +0200 |
commit | ef47c8a38690a16e8b42b5fbbefdd8610fe97d8e (patch) | |
tree | f0ebfb34e207958b29bd8b74c471ed18c6ee10b2 | |
parent | Additional fix for bug 4019 (diff) | |
download | ice-ef47c8a38690a16e8b42b5fbbefdd8610fe97d8e.tar.bz2 ice-ef47c8a38690a16e8b42b5fbbefdd8610fe97d8e.tar.xz ice-ef47c8a38690a16e8b42b5fbbefdd8610fe97d8e.zip |
2564 ObjectAdapter::removeServantLocator issues.
-rw-r--r-- | cpp/src/Ice/ServantManager.cpp | 54 | ||||
-rw-r--r-- | cpp/test/Ice/servantLocator/Collocated.cpp | 6 | ||||
-rw-r--r-- | cpp/test/Ice/servantLocator/Server.cpp | 6 | ||||
-rw-r--r-- | cpp/test/Ice/servantLocator/ServerAMD.cpp | 6 | ||||
-rw-r--r-- | cs/src/Ice/ServantManager.cs | 42 | ||||
-rw-r--r-- | cs/test/Ice/servantLocator/TestActivationI.cs | 6 | ||||
-rw-r--r-- | java/src/IceInternal/ServantManager.java | 36 | ||||
-rw-r--r-- | java/test/Ice/servantLocator/AMDTestActivationI.java | 6 | ||||
-rw-r--r-- | java/test/Ice/servantLocator/TestActivationI.java | 6 |
9 files changed, 97 insertions, 71 deletions
diff --git a/cpp/src/Ice/ServantManager.cpp b/cpp/src/Ice/ServantManager.cpp index 4820b979350..d48173717df 100644 --- a/cpp/src/Ice/ServantManager.cpp +++ b/cpp/src/Ice/ServantManager.cpp @@ -366,7 +366,6 @@ IceInternal::ServantManager::removeServantLocator(const string& category) if(p != _locatorMap.end()) { locator = p->second; - locator->deactivate(p->first); _locatorMap.erase(p); _locatorMapHint = _locatorMap.begin(); } @@ -438,45 +437,46 @@ IceInternal::ServantManager::destroy() { ServantMapMap servantMapMap; map<string, ServantLocatorPtr> locatorMap; + Ice::LoggerPtr logger; { IceUtil::Mutex::Lock sync(*this); assert(_instance); // Must not be called after destruction. + logger = _instance->initializationData().logger; servantMapMap.swap(_servantMapMap); _servantMapMapHint = _servantMapMap.end(); - for(map<string, ServantLocatorPtr>::const_iterator p = _locatorMap.begin(); p != _locatorMap.end(); ++p) + locatorMap.swap(_locatorMap); + _locatorMapHint = _locatorMap.end(); + _instance = 0; + } + + for(map<string, ServantLocatorPtr>::const_iterator p = locatorMap.begin(); p != locatorMap.end(); ++p) + { + try { - try - { - p->second->deactivate(p->first); - } - catch(const Exception& ex) - { - Error out(_instance->initializationData().logger); - out << "exception during locator deactivation:\n" - << "object adapter: `" << _adapterName << "'\n" - << "locator category: `" << p->first << "'\n" - << ex; + p->second->deactivate(p->first); + } + catch(const Exception& ex) + { + Error out(logger); + out << "exception during locator deactivation:\n" + << "object adapter: `" << _adapterName << "'\n" + << "locator category: `" << p->first << "'\n" + << ex; #ifdef __GNUC__ - out << "\n" << ex.ice_stackTrace(); + out << "\n" << ex.ice_stackTrace(); #endif - } - catch(...) - { - Error out(_instance->initializationData().logger); - out << "unknown exception during locator deactivation:\n" - << "object adapter: `" << _adapterName << "'\n" - << "locator category: `" << p->first << "'"; - } } - - locatorMap.swap(_locatorMap); - _locatorMapHint = _locatorMap.end(); - - _instance = 0; + catch(...) + { + Error out(logger); + out << "unknown exception during locator deactivation:\n" + << "object adapter: `" << _adapterName << "'\n" + << "locator category: `" << p->first << "'"; + } } // diff --git a/cpp/test/Ice/servantLocator/Collocated.cpp b/cpp/test/Ice/servantLocator/Collocated.cpp index 777030c17f5..27548455745 100644 --- a/cpp/test/Ice/servantLocator/Collocated.cpp +++ b/cpp/test/Ice/servantLocator/Collocated.cpp @@ -61,8 +61,10 @@ public: } else { - current.adapter->removeServantLocator(""); - current.adapter->removeServantLocator("category"); + ServantLocatorPtr locator = current.adapter->removeServantLocator(""); + locator->deactivate(""); + locator = current.adapter->removeServantLocator("category"); + locator->deactivate("category"); } } }; diff --git a/cpp/test/Ice/servantLocator/Server.cpp b/cpp/test/Ice/servantLocator/Server.cpp index 3fd46e6af54..3aeec31ef5f 100644 --- a/cpp/test/Ice/servantLocator/Server.cpp +++ b/cpp/test/Ice/servantLocator/Server.cpp @@ -60,8 +60,10 @@ public: } else { - current.adapter->removeServantLocator(""); - current.adapter->removeServantLocator("category"); + ServantLocatorPtr locator = current.adapter->removeServantLocator(""); + locator->deactivate(""); + locator = current.adapter->removeServantLocator("category"); + locator->deactivate("category"); } } }; diff --git a/cpp/test/Ice/servantLocator/ServerAMD.cpp b/cpp/test/Ice/servantLocator/ServerAMD.cpp index 0f7a8788896..bcbbfc94fed 100644 --- a/cpp/test/Ice/servantLocator/ServerAMD.cpp +++ b/cpp/test/Ice/servantLocator/ServerAMD.cpp @@ -60,8 +60,10 @@ public: } else { - current.adapter->removeServantLocator(""); - current.adapter->removeServantLocator("category"); + ServantLocatorPtr locator = current.adapter->removeServantLocator(""); + locator->deactivate(""); + locator = current.adapter->removeServantLocator("category"); + locator->deactivate("category"); } } }; diff --git a/cs/src/Ice/ServantManager.cs b/cs/src/Ice/ServantManager.cs index 308f1d1facf..e6801972484 100644 --- a/cs/src/Ice/ServantManager.cs +++ b/cs/src/Ice/ServantManager.cs @@ -271,7 +271,6 @@ public sealed class ServantManager if(l != null) { _locatorMap.Remove(category); - l.deactivate(category); } return l; } @@ -325,31 +324,42 @@ public sealed class ServantManager // public void destroy() { + Dictionary<string, Ice.ServantLocator> locatorMap = null; + Ice.Logger logger = null; lock(this) { Debug.Assert(instance_ != null); // Must not be called after destruction. - + logger = instance_.initializationData().logger; _servantMapMap.Clear(); - foreach(KeyValuePair<string, Ice.ServantLocator> p in _locatorMap) + try { - Ice.ServantLocator locator = p.Value; - try - { - locator.deactivate(p.Key); - } - catch(System.Exception ex) - { - string s = "exception during locator deactivation:\n" + "object adapter: `" - + _adapterName + "'\n" + "locator category: `" + p.Key + "'\n" + ex; - instance_.initializationData().logger.error(s); - } + locatorMap = new Dictionary<string, Ice.ServantLocator>(_locatorMap); + } + catch(System.Exception ex) + { + string s = "exception during servant manager destroy:\n" + "object adapter: `" + + _adapterName + "'\n" + ex; + logger.error(s); } - _locatorMap.Clear(); - instance_ = null; } + + foreach(KeyValuePair<string, Ice.ServantLocator> p in locatorMap) + { + Ice.ServantLocator locator = p.Value; + try + { + locator.deactivate(p.Key); + } + catch(System.Exception ex) + { + string s = "exception during locator deactivation:\n" + "object adapter: `" + + _adapterName + "'\n" + "locator category: `" + p.Key + "'\n" + ex; + logger.error(s); + } + } } private Instance instance_; diff --git a/cs/test/Ice/servantLocator/TestActivationI.cs b/cs/test/Ice/servantLocator/TestActivationI.cs index f79fe2b8145..4a979db95b2 100644 --- a/cs/test/Ice/servantLocator/TestActivationI.cs +++ b/cs/test/Ice/servantLocator/TestActivationI.cs @@ -20,8 +20,10 @@ public sealed class TestActivationI : TestActivationDisp_ } else { - current.adapter.removeServantLocator(""); - current.adapter.removeServantLocator("category"); + Ice.ServantLocator locator = current.adapter.removeServantLocator(""); + locator.deactivate(""); + locator = current.adapter.removeServantLocator("category"); + locator.deactivate("category"); } } } diff --git a/java/src/IceInternal/ServantManager.java b/java/src/IceInternal/ServantManager.java index 01ded95ffd0..8f6dd6cb756 100644 --- a/java/src/IceInternal/ServantManager.java +++ b/java/src/IceInternal/ServantManager.java @@ -229,13 +229,10 @@ public final class ServantManager public synchronized Ice.ServantLocator removeServantLocator(String category) { + Ice.ServantLocator l = null; assert(_instance != null); // Must not be called after destruction. - - Ice.ServantLocator l = _locatorMap.remove(category); - if(l != null) - { - l.deactivate(category); - } + + l = _locatorMap.remove(category); return l; } @@ -266,15 +263,26 @@ public final class ServantManager // // Only for use by Ice.ObjectAdapterI. // - public synchronized void + public void destroy() { - assert(_instance != null); // Must not be called after destruction. - - _servantMapMap.clear(); + Object[] locatorMap = null; + Ice.Logger logger = null; + synchronized(this) + { + assert(_instance != null); // Must not be called after destruction. + logger = _instance.initializationData().logger; + _servantMapMap.clear(); + _locatorMap.clear(); + locatorMap = _locatorMap.entrySet().toArray(); + _instance = null; + } - for(java.util.Map.Entry<String, Ice.ServantLocator> p : _locatorMap.entrySet()) + for(int i = 0; i < locatorMap.length; ++i) { + @SuppressWarnings("unchecked") + java.util.Map.Entry<String, Ice.ServantLocator> p = + (java.util.Map.Entry<String, Ice.ServantLocator>)locatorMap[i]; Ice.ServantLocator locator = p.getValue(); try { @@ -288,13 +296,9 @@ public final class ServantManager pw.flush(); String s = "exception during locator deactivation:\n" + "object adapter: `" + _adapterName + "'\n" + "locator category: `" + p.getKey() + "'\n" + sw.toString(); - _instance.initializationData().logger.error(s); + logger.error(s); } } - - _locatorMap.clear(); - - _instance = null; } private Instance _instance; diff --git a/java/test/Ice/servantLocator/AMDTestActivationI.java b/java/test/Ice/servantLocator/AMDTestActivationI.java index 7b2b227b6c7..bf9e62d4109 100644 --- a/java/test/Ice/servantLocator/AMDTestActivationI.java +++ b/java/test/Ice/servantLocator/AMDTestActivationI.java @@ -22,8 +22,10 @@ public final class AMDTestActivationI extends _TestActivationDisp } else { - current.adapter.removeServantLocator(""); - current.adapter.removeServantLocator("category"); + Ice.ServantLocator locator = current.adapter.removeServantLocator(""); + locator.deactivate(""); + locator = current.adapter.removeServantLocator("category"); + locator.deactivate("category"); } } } diff --git a/java/test/Ice/servantLocator/TestActivationI.java b/java/test/Ice/servantLocator/TestActivationI.java index d5acdfc750c..299b8304905 100644 --- a/java/test/Ice/servantLocator/TestActivationI.java +++ b/java/test/Ice/servantLocator/TestActivationI.java @@ -22,8 +22,10 @@ public final class TestActivationI extends _TestActivationDisp } else { - current.adapter.removeServantLocator(""); - current.adapter.removeServantLocator("category"); + Ice.ServantLocator locator = current.adapter.removeServantLocator(""); + locator.deactivate(""); + locator = current.adapter.removeServantLocator("category"); + locator.deactivate("category"); } } } |