[jboss-cvs] JBossAS SVN: r86859 - in projects/aop/branches/Branch_2_1: asintegration-core and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Apr 6 12:51:21 EDT 2009


Author: kabir.khan at jboss.com
Date: 2009-04-06 12:51:20 -0400 (Mon, 06 Apr 2009)
New Revision: 86859

Modified:
   projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/classpool/AOPClassPool.java
   projects/aop/branches/Branch_2_1/asintegration-core/.classpath
   projects/aop/branches/Branch_2_1/asintegration-core/src/main/java/org/jboss/aop/classpool/BaseClassPool.java
   projects/aop/branches/Branch_2_1/asintegration-core/src/main/java/org/jboss/aop/classpool/ClassPoolDomainRegistry.java
   projects/aop/branches/Branch_2_1/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPool.java
   projects/aop/branches/Branch_2_1/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPoolFactory.java
Log:
[JBAOP-714] Fix classloader leaks in the new classpools

Modified: projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/classpool/AOPClassPool.java
===================================================================
--- projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/classpool/AOPClassPool.java	2009-04-06 16:46:38 UTC (rev 86858)
+++ projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/classpool/AOPClassPool.java	2009-04-06 16:51:20 UTC (rev 86859)
@@ -21,7 +21,9 @@
   */
 package org.jboss.aop.classpool;
 
+import java.util.Iterator;
 import java.util.Map;
+import java.util.WeakHashMap;
 import java.util.concurrent.ConcurrentHashMap;
 
 import javassist.ClassPool;
@@ -63,6 +65,8 @@
    
    private final AOPCLassPoolSearchStrategy searchStrategy;
    
+   private final Map<AOPClassPool, Boolean> children = new WeakHashMap<AOPClassPool, Boolean>();
+   
    static
    {
       ClassPool.doPruning = false;
@@ -117,8 +121,26 @@
          }
       }
       if (logger.isTraceEnabled()) logger.trace(this + " creating pool for loader " + cl + " searchStrategy:" + this.searchStrategy + " isTemp:" + isTemp);
+
+      registerWithParent();
    }
    
+   private void registerWithParent()
+   {
+      if (parent != null && parent instanceof AOPClassPool)
+      {
+         ((AOPClassPool)parent).children.put(this, Boolean.TRUE);
+      }
+   }
+   
+   private void unregisterWithParent()
+   {
+      if (parent != null && parent instanceof AOPClassPool)
+      {
+         ((AOPClassPool)parent).children.remove(this);
+      }
+   }
+   
    public void registerGeneratedClass(String className)
    {
       generatedClasses.put(className, className);
@@ -137,7 +159,18 @@
    public void close()
    {
       super.close();
+      unregisterWithParent();
       AOPClassPoolRepository.getInstance().perfomUnregisterClassLoader(getClassLoader());
+      for (Iterator<AOPClassPool> it = children.keySet().iterator() ; it.hasNext() ; )
+      {
+         AOPClassPool child = it.next();
+         it.remove();
+         ClassLoader loader = child.getClassLoader();
+         if (loader != null)
+         {
+            AspectManager.instance().unregisterClassLoader(loader);
+         }
+      }
    }
 
    public CtClass getCached(String classname)

Modified: projects/aop/branches/Branch_2_1/asintegration-core/.classpath
===================================================================
--- projects/aop/branches/Branch_2_1/asintegration-core/.classpath	2009-04-06 16:46:38 UTC (rev 86858)
+++ projects/aop/branches/Branch_2_1/asintegration-core/.classpath	2009-04-06 16:51:20 UTC (rev 86859)
@@ -15,7 +15,7 @@
 	<classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar" sourcepath="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1-sources.jar"/>
 	<classpathentry kind="var" path="M2_REPO/wutka-dtdparser/dtdparser121/1.2.1/dtdparser121-1.2.1.jar"/>
 	<classpathentry kind="var" path="M2_REPO/urbanophile/java-getopt/1.0.9/java-getopt-1.0.9.jar"/>
-	<classpathentry kind="var" path="M2_REPO/javassist/javassist/3.10.0.GA/javassist-3.10.0.GA.jar"/>
+	<classpathentry kind="var" path="M2_REPO/javassist/javassist/3.10.0.GA/javassist-3.10.0.GA.jar" sourcepath="/M2_REPO/javassist/javassist/3.10.0.GA/javassist-3.10.0.GA-sources.jar"/>
 	<classpathentry kind="var" path="M2_REPO/javax/xml/bind/jaxb-api/2.1/jaxb-api-2.1.jar" sourcepath="M2_REPO/javax/xml/bind/jaxb-api/2.1/jaxb-api-2.1-sources.jar"/>
 	<classpathentry kind="var" path="M2_REPO/sun-jaxb/jaxb-api/2.1.4/jaxb-api-2.1.4.jar" sourcepath="M2_REPO/sun-jaxb/jaxb-api/2.1.4/jaxb-api-2.1.4-sources.jar"/>
 	<classpathentry kind="src" path="/jboss-aop"/>

Modified: projects/aop/branches/Branch_2_1/asintegration-core/src/main/java/org/jboss/aop/classpool/BaseClassPool.java
===================================================================
--- projects/aop/branches/Branch_2_1/asintegration-core/src/main/java/org/jboss/aop/classpool/BaseClassPool.java	2009-04-06 16:46:38 UTC (rev 86858)
+++ projects/aop/branches/Branch_2_1/asintegration-core/src/main/java/org/jboss/aop/classpool/BaseClassPool.java	2009-04-06 16:51:20 UTC (rev 86859)
@@ -126,6 +126,8 @@
    @Override
    public void close()
    {
+      super.close();
+
       if (logger.isTraceEnabled()) logger.trace(this + " closing");
    }
 

Modified: projects/aop/branches/Branch_2_1/asintegration-core/src/main/java/org/jboss/aop/classpool/ClassPoolDomainRegistry.java
===================================================================
--- projects/aop/branches/Branch_2_1/asintegration-core/src/main/java/org/jboss/aop/classpool/ClassPoolDomainRegistry.java	2009-04-06 16:46:38 UTC (rev 86858)
+++ projects/aop/branches/Branch_2_1/asintegration-core/src/main/java/org/jboss/aop/classpool/ClassPoolDomainRegistry.java	2009-04-06 16:51:20 UTC (rev 86859)
@@ -21,6 +21,7 @@
 */ 
 package org.jboss.aop.classpool;
 
+import java.lang.ref.WeakReference;
 import java.util.Map;
 import java.util.WeakHashMap;
 
@@ -33,21 +34,26 @@
 {
    final static ClassPoolDomainRegistry INSTANCE = new ClassPoolDomainRegistry();
    
-   final Map<Object, ClassPoolDomain> domains = new WeakHashMap<Object, ClassPoolDomain>();
+   final Map<Object, WeakReference<ClassPoolDomain>> domains = new WeakHashMap<Object, WeakReference<ClassPoolDomain>>();
    
    public static ClassPoolDomainRegistry getInstance()
    {
       return INSTANCE;
    }
    
-   public ClassPoolDomain getDomain(Object key)
+   public synchronized ClassPoolDomain getDomain(Object key)
    {
-      return domains.get(key);
+      WeakReference<ClassPoolDomain> ref = domains.get(key);
+      if (ref == null)
+      {
+         return null;
+      }
+      return ref.get();
    }
    
-   public void addClassPoolDomain(Object key, ClassPoolDomain domain)
+   public synchronized void addClassPoolDomain(Object key, ClassPoolDomain domain)
    {
-      domains.put(key, domain);
+      domains.put(key, new WeakReference<ClassPoolDomain>(domain));
    }
    
 }

Modified: projects/aop/branches/Branch_2_1/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPool.java
===================================================================
--- projects/aop/branches/Branch_2_1/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPool.java	2009-04-06 16:46:38 UTC (rev 86858)
+++ projects/aop/branches/Branch_2_1/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPool.java	2009-04-06 16:51:20 UTC (rev 86859)
@@ -21,6 +21,7 @@
 */ 
 package org.jboss.aop.classpool.jbosscl;
 
+import java.lang.ref.WeakReference;
 import java.security.ProtectionDomain;
 
 import javassist.CannotCompileException;
@@ -28,6 +29,7 @@
 import javassist.CtClass;
 import javassist.scopedpool.ScopedClassPoolRepository;
 
+import org.jboss.aop.asintegration.jboss5.RegisterModuleCallback;
 import org.jboss.aop.asintegration.jboss5.ToClassInvoker;
 import org.jboss.aop.asintegration.jboss5.ToClassInvokerPoolReference;
 import org.jboss.aop.classpool.ClassPoolDomain;
@@ -41,12 +43,13 @@
  */
 public class JBossClDelegatingClassPool extends DelegatingClassPool implements ToClassInvokerPoolReference
 {
-   private Module module;
+   private WeakReference<Module> module;
+   private RegisterModuleCallback callback;
 
    ToClassInvoker toClassInvoker;
    
    protected JBossClDelegatingClassPool(ClassPoolDomain domain, ClassLoader cl, ClassPool parent,
-         ScopedClassPoolRepository repository, Module module)
+         ScopedClassPoolRepository repository, Module module, RegisterModuleCallback callback)
    {
       super(domain, cl, parent, repository);
       if (module == null)
@@ -57,7 +60,8 @@
       {
          throw new IllegalArgumentException("Domain was not instance of JBossClClassPoolDomain: " + domain.getClass().getName());
       }
-      this.module = module;
+      this.module = new WeakReference<Module>(module);
+      this.callback = callback;
       toClassInvoker = new ToClassInvoker(module == null ? null : module.getDynamicClassRoot());
       if (logger.isTraceEnabled()) logger.trace(this + " module");
       ((JBossClClassPoolDomain)domain).setupPoolsByPackage(this);
@@ -65,7 +69,11 @@
 
    Module getModule()
    {
-      return module;
+      if (module != null)
+      {
+         return module.get();
+      }
+      return null;
    }
    
    public Class<?> toClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
@@ -78,4 +86,10 @@
       return super.toClass(cc, loader, domain);
    }
 
+   @Override
+   public void close()
+   {
+      super.close();
+      callback.removeModule(getModule());
+   }
 }

Modified: projects/aop/branches/Branch_2_1/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPoolFactory.java
===================================================================
--- projects/aop/branches/Branch_2_1/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPoolFactory.java	2009-04-06 16:46:38 UTC (rev 86858)
+++ projects/aop/branches/Branch_2_1/asintegration-mc/src/main/java/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPoolFactory.java	2009-04-06 16:51:20 UTC (rev 86859)
@@ -64,7 +64,7 @@
    public ScopedClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
    {
       ClassPool parent = getCreateParentClassPools(cl, src, repository);
-
+      
       if (cl instanceof RealClassLoader)
       {
          Module module = registry.getModule(cl);
@@ -75,13 +75,13 @@
          registerModuleCallback.registerModule(module);
          registerBootstrapLoaders();
          ClassPoolDomain domain = getDomain(module, cl);  
-         return new JBossClDelegatingClassPool(domain, cl, parent, repository, module);
+         return new JBossClDelegatingClassPool(domain, cl, parent, repository, module, registerModuleCallback);
       }
       
       return new NonDelegatingClassPool(cl, parent, repository, true);
    }
 
-   private ClassPoolDomain getDomain(Module module, ClassLoader cl)
+   private synchronized ClassPoolDomain getDomain(Module module, ClassLoader cl)
    {
       ClassLoaderDomain domain = null;
       ClassLoaderSystem sys = registry.getSystem();




More information about the jboss-cvs-commits mailing list