You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by mn...@apache.org on 2013/02/12 12:36:34 UTC

svn commit: r1445106 - /aries/trunk/application/application-runtime-isolated/src/main/java/org/apache/aries/application/runtime/isolated/impl/ApplicationContextManagerImpl.java

Author: mnuttall
Date: Tue Feb 12 11:36:34 2013
New Revision: 1445106

URL: http://svn.apache.org/r1445106
Log:
Aries-1016: Deadlock potential in ApplicationContextManagerImpl

Modified:
    aries/trunk/application/application-runtime-isolated/src/main/java/org/apache/aries/application/runtime/isolated/impl/ApplicationContextManagerImpl.java

Modified: aries/trunk/application/application-runtime-isolated/src/main/java/org/apache/aries/application/runtime/isolated/impl/ApplicationContextManagerImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/application/application-runtime-isolated/src/main/java/org/apache/aries/application/runtime/isolated/impl/ApplicationContextManagerImpl.java?rev=1445106&r1=1445105&r2=1445106&view=diff
==============================================================================
--- aries/trunk/application/application-runtime-isolated/src/main/java/org/apache/aries/application/runtime/isolated/impl/ApplicationContextManagerImpl.java (original)
+++ aries/trunk/application/application-runtime-isolated/src/main/java/org/apache/aries/application/runtime/isolated/impl/ApplicationContextManagerImpl.java Tue Feb 12 11:36:34 2013
@@ -23,8 +23,11 @@ import static org.apache.aries.applicati
 import static org.apache.aries.application.utils.AppConstants.LOG_EXCEPTION;
 import static org.apache.aries.application.utils.AppConstants.LOG_EXIT;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -124,47 +127,53 @@ public class ApplicationContextManagerIm
     return result;
   }
 
-  public synchronized void remove(AriesApplicationContext app) throws BundleException
+  public void remove(AriesApplicationContext app) throws BundleException
   {
     LOGGER.debug(LOG_ENTRY, "remove", app);
     
-    Iterator<Map.Entry<AriesApplication, AriesApplicationContext>> it = _appToContextMap.entrySet()
-        .iterator();
-
-    while (it.hasNext()) {
-      Map.Entry<AriesApplication, AriesApplicationContext> entry = it.next();
-
-      ApplicationContextImpl potentialMatch = (ApplicationContextImpl) entry.getValue();
-
-      if (potentialMatch == app) {
-        it.remove();
-
-        potentialMatch.uninstall();
-
-        break;
-      }
+    ApplicationContextImpl appToRemove = null;
+    synchronized (_appToContextMap) { 
+    	Iterator<Map.Entry<AriesApplication, AriesApplicationContext>> it = _appToContextMap.entrySet().iterator();
+    	while (it.hasNext()) {
+        Map.Entry<AriesApplication, AriesApplicationContext> entry = it.next();
+        ApplicationContextImpl potentialMatch = (ApplicationContextImpl) entry.getValue();
+        if (potentialMatch == app) {
+          it.remove();
+          appToRemove = potentialMatch;
+          break;
+        }
+    	}
     }
-        
+    
+    if (appToRemove != null) { 
+    	appToRemove.uninstall();
+    }
+
     LOGGER.debug(LOG_EXIT, "remove");
   }
   
-  public synchronized void close()
+  public void close()
   {
     LOGGER.debug(LOG_ENTRY, "close");
     
-    Iterator<AriesApplicationContext> it = _appToContextMap.values().iterator();
-    while (it.hasNext())
-    {      
-      try {
-        ApplicationContextImpl ctx = (ApplicationContextImpl)it.next();
-        if (ctx.getApplicationState() != ApplicationState.UNINSTALLED) {
-          ctx.uninstall();
-        }
-      } catch (BundleException e)
+    List<ApplicationContextImpl> contextsToUninstall = new ArrayList<ApplicationContextImpl>();
+    synchronized (_appToContextMap) { 
+    	Iterator<AriesApplicationContext> it = _appToContextMap.values().iterator();
+    	while (it.hasNext()) { 
+    		ApplicationContextImpl ctx = (ApplicationContextImpl)it.next();
+    		if (ctx.getApplicationState() != ApplicationState.UNINSTALLED) { 
+    			contextsToUninstall.add(ctx);
+    			it.remove();
+    		}
+    	}
+    }
+    for (ApplicationContextImpl c : contextsToUninstall) { 
+    	try { 
+    		c.uninstall();
+    	} catch (BundleException e)
       {
         LOGGER.debug(LOG_EXCEPTION,e);
       }
-      it.remove();
     }
     
     LOGGER.debug(LOG_EXIT, "close");
@@ -192,42 +201,41 @@ public class ApplicationContextManagerIm
     return ctx;
   }
 
-  public synchronized void bindBundleFrameworkManager(BundleFrameworkManager bfm)
+  public void bindBundleFrameworkManager(BundleFrameworkManager bfm)
   {
     LOGGER.debug(LOG_ENTRY, "bindBundleFrameworkManager", bfm);
     
-    Iterator<AriesApplicationContext> it = _appToContextMap.values().iterator();
-    while (it.hasNext())
-    {      
-      try {
-        ApplicationContextImpl ctx = (ApplicationContextImpl)it.next();
-        ctx.open();
-      } catch (BundleException e)
-      {
+    List<AriesApplicationContext> contexts = new ArrayList<AriesApplicationContext>();
+    synchronized (_appToContextMap) { 
+    	contexts.addAll (_appToContextMap.values());
+    }
+    
+    for (AriesApplicationContext ctx : contexts) { 
+    	try { 
+    		((ApplicationContextImpl)ctx).open();
+    	} catch (BundleException e) {
         LOGGER.debug(LOG_EXCEPTION,e);
       }
     }
     LOGGER.debug(LOG_EXIT, "bindBundleFrameworkManager");
   }
 
-  public synchronized void unbindBundleFrameworkManager(BundleFrameworkManager bfm)
+  public void unbindBundleFrameworkManager(BundleFrameworkManager bfm)
   {
     LOGGER.debug(LOG_ENTRY, "unbindBundleFrameworkManager", bfm);
     
-    Iterator<AriesApplicationContext> it = _appToContextMap.values().iterator();
-    while (it.hasNext())
-    {      
-      try {
-        ApplicationContextImpl ctx = (ApplicationContextImpl)it.next();
-        ctx.close();
-      } catch (BundleException e)
-      {
-        LOGGER.debug(LOG_EXCEPTION,e);
-      }
+    List<AriesApplicationContext> appContexts = new ArrayList<AriesApplicationContext>();
+    synchronized (_appToContextMap) { 
+    	appContexts.addAll(_appToContextMap.values());
+    }
+    for (AriesApplicationContext c : appContexts) { 
+    	try { 
+    		((ApplicationContextImpl)c).close();
+    	} catch (BundleException e) { 
+    		LOGGER.debug(LOG_EXCEPTION,e);
+    	}
     }
-    
+   
     LOGGER.debug(LOG_EXIT, "unbindBundleFrameworkManager");
-    
-    
   }
 }
\ No newline at end of file