[jboss-cvs] JBossAS SVN: r112006 - in projects/aop/branches/Branch_2_1/aop/src: main/java/org/jboss/aop/classpool and 2 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Thu Aug 11 12:25:33 EDT 2011
Author: kabir.khan at jboss.com
Date: 2011-08-11 12:25:33 -0400 (Thu, 11 Aug 2011)
New Revision: 112006
Modified:
projects/aop/branches/Branch_2_1/aop/src/main/java/org/
projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/classpool/AOPClassPoolRepository.java
projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/proxy/container/ContainerCache.java
projects/aop/branches/Branch_2_1/aop/src/test/java/org/
Log:
[JBAOP-807] Clean up ContainerCache containers on undeploy
Property changes on: projects/aop/branches/Branch_2_1/aop/src/main/java/org
___________________________________________________________________
Deleted: svn:mergeinfo
-
Modified: projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/classpool/AOPClassPoolRepository.java
===================================================================
--- projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/classpool/AOPClassPoolRepository.java 2011-08-11 16:03:57 UTC (rev 112005)
+++ projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/classpool/AOPClassPoolRepository.java 2011-08-11 16:25:33 UTC (rev 112006)
@@ -18,7 +18,7 @@
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-*/
+*/
package org.jboss.aop.classpool;
import java.lang.ref.WeakReference;
@@ -35,6 +35,7 @@
import org.jboss.aop.advice.SecurityActions;
import org.jboss.aop.instrument.Instrumentor;
import org.jboss.logging.Logger;
+import org.jboss.aop.proxy.container.ContainerCache;
import javassist.ClassPool;
import javassist.scopedpool.ScopedClassPool;
@@ -44,29 +45,29 @@
/**
* Singleton classpool repository used by aop
- *
+ *
* @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
* @version $Revision$
*/
public class AOPClassPoolRepository implements ScopedClassPoolRepository
{
private static final Logger logger = Logger.getLogger(AOPClassPoolRepository.class);
-
+
private final static AOPClassPoolRepository instance = new AOPClassPoolRepository();
-
+
/** The classes per classppol */
protected final HashMap<ClassLoader, HashSet<Class<?>>> ucl2classes = new HashMap<ClassLoader, HashSet<Class<?>>>();
/** The top-level AspectManager this pool belongs to */
AspectManager manager;
-
+
ScopedClassPoolRepository delegate;
public static AOPClassPoolRepository getInstance()
{
return instance;
}
-
+
private AOPClassPoolRepository()
{
this.delegate = ScopedClassPoolRepositoryImpl.getInstance();
@@ -86,7 +87,7 @@
// {
// Class jbcpf = Class.forName("org.jboss.aop.deployment.JBossClassPoolFactory");
// ScopedClassPoolFactory factory = (ScopedClassPoolFactory)jbcpf.newInstance();
-//
+//
// Class hlpr = Class.forName("org.jboss.aop.deployment.JBossScopedClassLoaderHelper");
// AOPScopedClassLoaderHelper helper = (AOPScopedClassLoaderHelper)hlpr.newInstance();
// delegate.setClassPoolFactory(factory);
@@ -98,12 +99,12 @@
// }
// return false;//Not running in JBoss probably
// }
-
+
public void setClassPoolFactory(ScopedClassPoolFactory factory)
{
delegate.setClassPoolFactory(factory);
}
-
+
public ScopedClassPoolFactory getClassPoolFactory()
{
return delegate.getClassPoolFactory();
@@ -133,10 +134,10 @@
{
this.manager = manager;
}
-
+
/**
* Get the registered classloaders
- *
+ *
* @return the registered classloaders
*/
public Map<ClassLoader, ClassPool> getRegisteredCLs()
@@ -151,7 +152,7 @@
{
delegate.clearUnregisteredClassLoaders();
}
-
+
public ClassPool registerClassLoader(ClassLoader ucl)
{
return delegate.registerClassLoader(ucl);
@@ -161,7 +162,7 @@
{
delegate.unregisterClassLoader(cl);
}
-
+
public void registerClass(Class<?> clazz)
{
ClassLoader classLoader = SecurityActions.getClassLoader(clazz);
@@ -185,7 +186,7 @@
UnregisterClassLoaderAction.PRIVILEGED.unregister(this, cl);
}
}
-
+
private void doUnregisterClassLoader(ClassLoader cl)
{
synchronized (delegate.getRegisteredCLs())
@@ -226,14 +227,15 @@
}
}
}
+ ContainerCache.cleanup(cl);
}
}
-
+
interface UnregisterClassLoaderAction
{
void unregister(AOPClassPoolRepository repository, ClassLoader loader);
-
+
UnregisterClassLoaderAction PRIVILEGED = new UnregisterClassLoaderAction()
{
public void unregister(final AOPClassPoolRepository repository, final ClassLoader loader)
@@ -252,8 +254,8 @@
catch (PrivilegedActionException e)
{
Exception ex = e.getException();
- if (ex instanceof RuntimeException)
- {
+ if (ex instanceof RuntimeException)
+ {
throw (RuntimeException)ex;
}
throw new RuntimeException(ex);
Modified: projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/proxy/container/ContainerCache.java
===================================================================
--- projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/proxy/container/ContainerCache.java 2011-08-11 16:03:57 UTC (rev 112005)
+++ projects/aop/branches/Branch_2_1/aop/src/main/java/org/jboss/aop/proxy/container/ContainerCache.java 2011-08-11 16:25:33 UTC (rev 112006)
@@ -31,6 +31,7 @@
import org.jboss.aop.introduction.InterfaceIntroduction;
import org.jboss.aop.metadata.SimpleMetaData;
import org.jboss.metadata.spi.MetaData;
+import org.jboss.util.collection.WeakSet;
/**
*
@@ -42,6 +43,7 @@
private static volatile int counter;
public static final Object mapLock = new Object();
private static WeakHashMap<Class<?>, HashMap<String, ClassProxyContainer>> containerCache = new WeakHashMap<Class<?>, HashMap<String, ClassProxyContainer>>();
+ private static WeakHashMap<ClassLoader, WeakSet> classesByLoader = new WeakHashMap<ClassLoader, WeakSet>();
private AspectManager manager;
private ContainerProxyCacheKey key;
@@ -96,6 +98,20 @@
return factory;
}
+ public static void cleanup(ClassLoader cl)
+ {
+ synchronized (mapLock)
+ {
+ WeakSet classes = classesByLoader.remove(cl);
+ if (classes != null) {
+ for (Object o : classes)
+ {
+ containerCache.remove(o);
+ }
+ }
+ }
+ }
+
public ContainerProxyCacheKey getKey()
{
return key;
@@ -124,10 +140,10 @@
}
return classAdvisor.hasAspects();
}
-
+
public boolean hasIntroductionsForClassAdvisor()
{
- return classAdvisor.getInterfaceIntroductions().size() > 0;
+ return classAdvisor.getInterfaceIntroductions().size() > 0;
}
public boolean requiresInstanceAdvisor()
@@ -175,7 +191,7 @@
}
return null;
}
-
+
private ClassProxyContainer getCachedContainer(AspectManager manager)
{
HashMap<String, ClassProxyContainer> managerContainers = containerCache.get(key.getClazz());
@@ -214,6 +230,17 @@
containerCache.put(key.getClazz(), managerContainers);
}
managerContainers.put(key.getManagerFQN(), container);
+ ClassLoader cl = key.getClazz().getClassLoader();
+ if (cl != null)
+ {
+ WeakSet classes = classesByLoader.get(cl);
+ if (classes == null)
+ {
+ classes = new WeakSet();
+ classesByLoader.put(cl, classes);
+ }
+ classes.add(key.getClazz());
+ }
}
private InterfaceIntroduction getInterfaceIntroduction()
@@ -292,36 +319,36 @@
instanceContainer = InstanceProxyContainer.createInstanceProxyContainer(classAdvisor, introduction, metaData);
}
}
-
+
public boolean hasMoreAdvicesOrIntroductionsForInstance()
{
if (classAdvisor == null)
{
throw new IllegalStateException("initialise() must be called first");
}
-
+
if (instanceContainer == null)
{
return false;
}
-
+
if (!classAdvisor.hasSameMethodAspectLength(instanceContainer))
{
return true;
}
-
+
if (!classAdvisor.hasSameConstructorAspectLength(instanceContainer))
{
return true;
}
-
+
if (instanceContainer.getInterfaceIntroductions().size() > classAdvisor.getInterfaceIntroductions().size())
{
return true;
}
return false;
}
-
+
}
Property changes on: projects/aop/branches/Branch_2_1/aop/src/test/java/org
___________________________________________________________________
Deleted: svn:mergeinfo
-
More information about the jboss-cvs-commits
mailing list