summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2009-08-12 00:34:01 +0200
committerJose <jose@zeroc.com>2009-08-12 00:34:01 +0200
commitef47c8a38690a16e8b42b5fbbefdd8610fe97d8e (patch)
treef0ebfb34e207958b29bd8b74c471ed18c6ee10b2
parentAdditional fix for bug 4019 (diff)
downloadice-ef47c8a38690a16e8b42b5fbbefdd8610fe97d8e.tar.bz2
ice-ef47c8a38690a16e8b42b5fbbefdd8610fe97d8e.tar.xz
ice-ef47c8a38690a16e8b42b5fbbefdd8610fe97d8e.zip
2564 ObjectAdapter::removeServantLocator issues.
-rw-r--r--cpp/src/Ice/ServantManager.cpp54
-rw-r--r--cpp/test/Ice/servantLocator/Collocated.cpp6
-rw-r--r--cpp/test/Ice/servantLocator/Server.cpp6
-rw-r--r--cpp/test/Ice/servantLocator/ServerAMD.cpp6
-rw-r--r--cs/src/Ice/ServantManager.cs42
-rw-r--r--cs/test/Ice/servantLocator/TestActivationI.cs6
-rw-r--r--java/src/IceInternal/ServantManager.java36
-rw-r--r--java/test/Ice/servantLocator/AMDTestActivationI.java6
-rw-r--r--java/test/Ice/servantLocator/TestActivationI.java6
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");
}
}
}