[jboss-cvs] JBossAS SVN: r67724 - trunk/jmx/src/main/org/jboss/mx/loading.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Sun Dec 2 00:53:22 EST 2007


Author: scott.stark at jboss.org
Date: 2007-12-02 00:53:22 -0500 (Sun, 02 Dec 2007)
New Revision: 67724

Modified:
   trunk/jmx/src/main/org/jboss/mx/loading/UnifiedLoaderRepository3.java
Log:
Further guard against ConcurrentModificationException when class loaders are being removed.

Modified: trunk/jmx/src/main/org/jboss/mx/loading/UnifiedLoaderRepository3.java
===================================================================
--- trunk/jmx/src/main/org/jboss/mx/loading/UnifiedLoaderRepository3.java	2007-12-01 22:24:38 UTC (rev 67723)
+++ trunk/jmx/src/main/org/jboss/mx/loading/UnifiedLoaderRepository3.java	2007-12-02 05:53:22 UTC (rev 67724)
@@ -248,8 +248,10 @@
       Set pkgSet = (Set) packagesMap.get(pkgName);
       if (dynamicClassLoaders.size() > 0)
       {
-         if (pkgSet == null)
-            pkgSet = ClassLoaderUtils.newPackageSet();
+         Set<RepositoryClassLoader> newSet = ClassLoaderUtils.newPackageSet();
+         if(pkgSet != null)
+            newSet.addAll(pkgSet);
+         pkgSet = newSet;
          pkgSet.addAll(dynamicClassLoaders);
       }
       return pkgSet;
@@ -936,7 +938,12 @@
                   Set pkgSet = (Set) packagesMap.get(pkgName);
                   if (pkgSet != null)
                   {
+                     Set<RepositoryClassLoader> newSet = ClassLoaderUtils.newPackageSet();
+                     newSet.addAll(pkgSet);
+                     pkgSet = newSet;
+
                      pkgSet.remove(cl);
+                     packagesMap.put(pkgName, newSet);
                      if (pkgSet.isEmpty())
                         packagesMap.remove(pkgName);
                   }               
@@ -951,7 +958,13 @@
             {
                Map.Entry entry = (Map.Entry) i.next();
                Set pkgSet = (Set) entry.getValue();
-               pkgSet.remove(cl);
+               if(pkgSet.contains(cl) && pkgSet.size() > 1)
+               {
+                  Set<RepositoryClassLoader> newSet = ClassLoaderUtils.newPackageSet();
+                  newSet.addAll(pkgSet);
+                  newSet.remove(cl);
+                  packagesMap.put(entry.getKey(), newSet);
+               }
                if (pkgSet.isEmpty())
                   i.remove();
             }
@@ -1138,10 +1151,10 @@
             // Make a copy of the pkgSet to avoid concurrent mods
             Set<RepositoryClassLoader> newSet = ClassLoaderUtils.newPackageSet();
             newSet.addAll(pkgSet);
-            packagesMap.put(pkgName, newSet);
             pkgSet = newSet;
             // Add the class loader
             pkgSet.add((RepositoryClassLoader)loader);
+            packagesMap.put(pkgName, newSet);
             List<String> loaderPkgNames = loaderToPackagesMap.get(loader);
             if( loaderPkgNames == null )
             {




More information about the jboss-cvs-commits mailing list