[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