[jboss-cvs] JBossAS SVN: r96658 - projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/jbosscl.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Fri Nov 20 15:24:37 EST 2009
Author: flavia.rainone at jboss.com
Date: 2009-11-20 15:24:37 -0500 (Fri, 20 Nov 2009)
New Revision: 96658
Modified:
projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/jbosscl/JBossClDelegatingClassPoolFactory.java
Log:
[JBREFLECT-69] JBossClDelegatingCPFactory was creating duplicate CPs, which was resulting in non-cleaned up class pools.
Now, JBossClDelegatingCPFactory aborts the recursive creation of a CP if this CP is already being created in an outer scope of the recursion.
Modified: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/jbosscl/JBossClDelegatingClassPoolFactory.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/jbosscl/JBossClDelegatingClassPoolFactory.java 2009-11-20 20:22:29 UTC (rev 96657)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/jbosscl/JBossClDelegatingClassPoolFactory.java 2009-11-20 20:24:37 UTC (rev 96658)
@@ -24,12 +24,12 @@
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Collection;
+import java.util.HashSet;
import javassist.ClassPool;
import javassist.scopedpool.ScopedClassPoolFactory;
import javassist.scopedpool.ScopedClassPoolRepository;
-import org.jboss.classloader.plugins.loader.ClassLoaderToLoaderAdapter;
import org.jboss.classloader.spi.ClassLoaderDomain;
import org.jboss.classloader.spi.ClassLoaderSystem;
import org.jboss.classloading.spi.RealClassLoader;
@@ -37,13 +37,11 @@
import org.jboss.classloading.spi.dependency.Module;
import org.jboss.classpool.domain.ClassPoolDomain;
import org.jboss.classpool.domain.ClassPoolDomainRegistry;
-import org.jboss.classpool.domain.ClassPoolToClassPoolDomainAdapter;
import org.jboss.classpool.plugins.as.NonDelegatingClassPool;
import org.jboss.classpool.plugins.as.temp.TempClassPoolFactory;
import org.jboss.classpool.plugins.as5.DomainRegistry;
import org.jboss.classpool.plugins.as5.RegisterModuleCallback;
import org.jboss.classpool.spi.AbstractClassPool;
-import org.jboss.classpool.spi.ClassPoolRepository;
/**
*
@@ -56,14 +54,23 @@
private final RegisterModuleCallback registerModuleCallback;
+ private Collection<ClassLoader> currentClassLoaders = new HashSet<ClassLoader>();
+
public JBossClDelegatingClassPoolFactory(DomainRegistry registry, RegisterModuleCallback registerModuleCallback)
{
this.registry = registry;
this.registerModuleCallback = registerModuleCallback;
}
- public AbstractClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
+ public synchronized AbstractClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
{
+ if (this.currentClassLoaders.contains(cl))
+ {
+ return null;
+ }
+ currentClassLoaders.add(cl);
+ try
+ {
ClassPool parent = getCreateParentClassPools(cl, src, repository);
if (cl instanceof RealClassLoader)
@@ -74,15 +81,26 @@
module = getModuleForClassLoader(cl);
}
registerModuleCallback.registerModule(module);
- registerBootstrapLoaders();
- ClassPoolDomain domain = getDomain(module, cl);
+ registerBootstrapLoaders(module, repository);
+ ClassPoolDomain domain = getDomain(module, cl, repository);
+ // this indicates that the domain corresponds to a cp that is being created
+ // to avoid duplicate class pools
+ if (domain == null)
+ {
+ return null;
+ }
return new JBossClDelegatingClassPool(domain, cl, parent, repository, module, registerModuleCallback);
}
return new NonDelegatingClassPool(cl, parent, repository, true);
+ }
+ finally
+ {
+ this.currentClassLoaders.remove(cl);
+ }
}
- private synchronized ClassPoolDomain getDomain(Module module, ClassLoader cl)
+ private synchronized ClassPoolDomain getDomain(Module module, ClassLoader cl, ScopedClassPoolRepository repository)
{
ClassLoaderDomain domain = null;
ClassLoaderSystem sys = registry.getSystem();
@@ -97,11 +115,11 @@
domain = registry.getDefaultDomain();
}
- return getDomain(cl, domain, sys);
+ return getDomain(cl, domain, sys, repository);
}
private ClassPoolDomain getDomain(ClassLoader cl, ClassLoaderDomain domain,
- ClassLoaderSystem sys)
+ ClassLoaderSystem sys, ScopedClassPoolRepository repository)
{
ClassPoolDomain poolDomain = ClassPoolDomainRegistry.getInstance().getDomain(domain);
if (poolDomain == null)
@@ -114,15 +132,19 @@
{
throw new RuntimeException("No domain found, domain name: " + parentDomainName);
}
- ClassPoolDomain parentPoolDomain = this.getDomain(null, parentDomain, sys);
+ ClassPoolDomain parentPoolDomain = this.getDomain(null, parentDomain, sys, repository);
poolDomain = new JBossClClassPoolDomain(domain.getName(), parentPoolDomain, domain.getParentPolicy(), registry);
}
else
{
ClassLoader parentUnitLoader = registry.getParentUnitLoader(cl);
- ClassPool parentUnitPool = parentUnitLoader == null? null: ClassPoolRepository.getInstance().registerClassLoader(parentUnitLoader);
- if (parentUnitPool== null)
+ if (this.currentClassLoaders.contains(parentUnitLoader))
{
+ return null;
+ }
+ ClassPool parentUnitPool = parentUnitLoader == null? null: repository.registerClassLoader(parentUnitLoader);
+ if (parentUnitPool == null)
+ {
poolDomain = new JBossClClassPoolDomain(domain.getName(), domain.getParentPolicy(), registry);
}
else
@@ -147,16 +169,27 @@
return parent;
}
- private void registerBootstrapLoaders()
+ private void registerBootstrapLoaders(Module skip, ScopedClassPoolRepository repository)
{
Collection<Module> unregistered = registerModuleCallback.getUnregisteredModules();
if (unregistered.size() > 0)
{
for (Module module : unregistered)
{
+ if (module == skip)
+ {
+ continue;
+ }
ClassLoader loader = getClassLoaderForModule(module);
- log.debug("Registering loader for module " + module + ": " + loader);
- ClassPoolRepository.getInstance().registerClassLoader(loader);
+ if (this.currentClassLoaders.contains(loader))
+ {
+ continue;
+ }
+ ClassPool classPool = repository.registerClassLoader(loader);
+ if (classPool == null)
+ {
+ repository.unregisterClassLoader(loader);
+ }
}
}
}
More information about the jboss-cvs-commits
mailing list