Remove some potential deadlocks. (FELIX-1287)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@797157 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java b/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
index 832e1e9..dd97fdb 100644
--- a/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
+++ b/framework/src/main/java/org/apache/felix/framework/ExtensionManager.java
@@ -106,7 +106,7 @@
m_extensionManager = extensionManager;
}
- private Logger m_logger = null;
+ private final Logger m_logger;
private final Map m_headerMap = new StringMap(false);
private final IModule m_module;
private ICapability[] m_capabilities = null;
@@ -120,6 +120,7 @@
// classloader.
private ExtensionManager()
{
+ m_logger = null;
m_module = null;
m_extensions = new ArrayList();
m_names = new HashSet();
@@ -188,7 +189,7 @@
}
}
- private ICapability[] aliasSymbolicName(ICapability[] caps)
+ private static ICapability[] aliasSymbolicName(ICapability[] caps)
{
if (caps == null)
{
@@ -258,7 +259,7 @@
* AdminPermission.EXTENSIONLIFECYCLE and security is enabled.
* @throws Exception in case something goes wrong.
*/
- void addExtensionBundle(Felix felix, BundleImpl bundle)
+ synchronized void addExtensionBundle(Felix felix, BundleImpl bundle)
throws SecurityException, BundleException, Exception
{
Object sm = System.getSecurityManager();
@@ -284,9 +285,6 @@
"Unsupported Extension Bundle type!"));
}
- // Not sure whether this is a good place to do it but we need to lock
- felix.acquireBundleLock(felix, Bundle.RESOLVED | Bundle.STARTING | Bundle.ACTIVE);
-
try
{
// TODO: EXTENSIONMANAGER - Should we be setting this?
@@ -335,10 +333,6 @@
// bundle.setExtension(false);
throw ex;
}
- finally
- {
- felix.releaseBundleLock(felix);
- }
felix.setBundleStateAndNotify(bundle, Bundle.RESOLVED);
}
@@ -400,7 +394,7 @@
}
}
- void setCapabilities(ICapability[] capabilities)
+ private void setCapabilities(ICapability[] capabilities)
{
m_capabilities = capabilities;
m_headerMap.put(Constants.EXPORT_PACKAGE, convertCapabilitiesToHeaders(m_headerMap));
@@ -627,12 +621,18 @@
public Map getHeaders()
{
- return m_headerMap;
+ synchronized (ExtensionManager.this)
+ {
+ return m_headerMap;
+ }
}
public ICapability[] getCapabilities()
{
- return m_capabilities;
+ synchronized (ExtensionManager.this)
+ {
+ return m_capabilities;
+ }
}
public String getSymbolicName()
@@ -647,9 +647,12 @@
public Class getClassByDelegation(String name) throws ClassNotFoundException
{
- if (!m_exportNames.contains(Util.getClassPackage(name)))
+ synchronized (ExtensionManager.this)
{
- throw new ClassNotFoundException(name);
+ if (!m_exportNames.contains(Util.getClassPackage(name)))
+ {
+ throw new ClassNotFoundException(name);
+ }
}
return getClass().getClassLoader().loadClass(name);
@@ -719,4 +722,4 @@
return getClass().getClassLoader().getResourceAsStream(urlPath);
}
}
-}
+}
\ No newline at end of file
diff --git a/framework/src/main/java/org/apache/felix/framework/Felix.java b/framework/src/main/java/org/apache/felix/framework/Felix.java
index 35e9db5..d141c5b 100644
--- a/framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -1898,25 +1898,7 @@
}
else
{
- // Acquire bundle lock.
- try
- {
- acquireBundleLock(this, Bundle.RESOLVED | Bundle.STARTING | Bundle.ACTIVE);
- }
- catch (IllegalStateException ex)
- {
- throw new BundleException(
- "System bundle must be active to attach an extension.");
- }
-
- try
- {
- m_extensionManager.startExtensionBundle(this, bundle);
- }
- finally
- {
- releaseBundleLock(this);
- }
+ m_extensionManager.startExtensionBundle(this, bundle);
}
fireBundleEvent(BundleEvent.UNRESOLVED, bundle);
@@ -2482,25 +2464,7 @@
if (bundle.isExtension())
{
- // Acquire bundle lock.
- try
- {
- acquireBundleLock(this, Bundle.RESOLVED | Bundle.STARTING | Bundle.ACTIVE);
- }
- catch (IllegalStateException ex)
- {
- throw new BundleException(
- "System bundle must be active to attach an extension.");
- }
-
- try
- {
- m_extensionManager.startExtensionBundle(this, bundle);
- }
- finally
- {
- releaseBundleLock(this);
- }
+ m_extensionManager.startExtensionBundle(this, bundle);
}
}
finally