[jboss-cvs] JBossAS SVN: r62432 - in projects/aop/trunk/aop/src/main/org/jboss/aop: advice and 1 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Thu Apr 19 16:59:56 EDT 2007
Author: kabir.khan at jboss.com
Date: 2007-04-19 16:59:56 -0400 (Thu, 19 Apr 2007)
New Revision: 62432
Modified:
projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java
projects/aop/trunk/aop/src/main/org/jboss/aop/advice/GeneratedAdvisorInterceptor.java
projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java
projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java
Log:
[JBAOP-378] Save PermGenSpace by caching generated joinpoint classes per joinpoint by interceptor chain. If a class already exists for a joinpoint and given set of chains, that should be reused rather than generating a new class.
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java 2007-04-19 20:54:01 UTC (rev 62431)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java 2007-04-19 20:59:56 UTC (rev 62432)
@@ -24,6 +24,7 @@
import java.lang.ref.WeakReference;
import java.util.ArrayList;
+import org.jboss.aop.advice.GeneratedAdvisorInterceptor;
import org.jboss.aop.advice.Interceptor;
import org.jboss.aop.joinpoint.IJoinPointInfo;
import org.jboss.aop.joinpoint.Joinpoint;
@@ -39,6 +40,8 @@
protected volatile Joinpoint joinpoint;
protected WeakReference clazz;
+
+ private String adviceString;
protected JoinPointInfo()
{
@@ -123,6 +126,7 @@
}
public void setInterceptorChain(ArrayList interceptorChain) {
+ adviceString = null;
this.interceptorChain = interceptorChain;
}
@@ -131,6 +135,7 @@
}
public void setInterceptors(Interceptor[] interceptors) {
+ adviceString = null;
this.interceptors = interceptors;
}
@@ -169,4 +174,31 @@
interceptors = other.interceptors.clone();
}
}
+
+ public String getAdviceString()
+ {
+ if (adviceString == null)
+ {
+ if (interceptors == null || interceptors.length == 0)
+ {
+ return "";
+ }
+
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0 ; i < interceptors.length ; i++)
+ {
+ if (i > 0)
+ {
+ buf.append(",");
+ }
+
+ GeneratedAdvisorInterceptor icptr = (GeneratedAdvisorInterceptor)interceptors[i];
+ buf.append(icptr.getAdviceString());
+ }
+
+ return buf.toString();
+ }
+
+ return adviceString;
+ }
}
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/advice/GeneratedAdvisorInterceptor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/advice/GeneratedAdvisorInterceptor.java 2007-04-19 20:54:01 UTC (rev 62431)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/advice/GeneratedAdvisorInterceptor.java 2007-04-19 20:59:56 UTC (rev 62432)
@@ -477,6 +477,43 @@
throw new RuntimeException("Invocation type not handled " + invocation);
}
+ String adviceString;
+ public String getAdviceString()
+ {
+ if (adviceString == null)
+ {
+ StringBuffer buf = new StringBuffer();
+ if (isAround())
+ {
+ buf.append("R");
+ }
+ else if (isBefore())
+ {
+ buf.append("B");
+ }
+ else if (isAfter())
+ {
+ buf.append("A");
+ }
+ else if (isThrowing())
+ {
+ buf.append("T");
+ }
+ else
+ {
+ throw new RuntimeException("No such interceptor");
+ }
+
+ buf.append("~#$%");
+ buf.append(getAspectClassName());
+ buf.append("->");
+ buf.append(getAdviceName());
+ adviceString = buf.toString();
+
+ }
+ return adviceString;
+ }
+
private class GeneratedOnlyInterceptor implements Interceptor
{
String name;
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java 2007-04-19 20:54:01 UTC (rev 62431)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java 2007-04-19 20:59:56 UTC (rev 62432)
@@ -59,11 +59,9 @@
//field names in advisor
private static final String DOMAIN = "domain";
- private static final String VERSION = "version";
private static final String CHECK_VERSION = "checkVersion";
private static final String ADVICES_UPDATED = "advicesUpdated";
private static final String INSTANCE_ADVISOR_MIXIN = "instanceAdvisorMixin";
- private static final String CLASS_ADVISOR = "classAdvisor";
//method names in advisor or GeneratedClassAdvisor
private static final String CREATE_INSTANCE_ADVISOR = "createInstanceAdvisor";
@@ -87,7 +85,6 @@
CtClass genadvisor;
CtClass genInstanceAdvisor;
-
public GeneratedAdvisorInstrumentor(AOPClassPool pool, AspectManager manager, JoinpointClassifier joinpointClassifier, DynamicTransformationObserver observer)
{
super(pool, manager, joinpointClassifier, observer);
@@ -307,10 +304,6 @@
final CtClass untransformable = getClassPool().get("org.jboss.aop.instrument.Untransformable");
genInstanceAdvisor.addInterface(untransformable);
- //Add reference to parent advisor
- CtField classAdvisor = new CtField(genadvisor, CLASS_ADVISOR, genInstanceAdvisor);
- genInstanceAdvisor.addField(classAdvisor);
-
CtMethod advicesUpdated = CtNewMethod.make(
Modifier.PROTECTED,
CtClass.voidType,
@@ -345,7 +338,6 @@
"{" +
" super($2);" +
" " + INSTANCE_ADVISOR_MIXIN + " = new org.jboss.aop.GeneratedInstanceAdvisorMixin($1, $2);" +
- " this.classAdvisor = $2;" +
"}";
CtConstructor ctor = CtNewConstructor.make(new CtClass[]{forName("java.lang.Object"), genadvisor}, new CtClass[0], body, genInstanceAdvisor);
genInstanceAdvisor.addConstructor(ctor);
@@ -603,6 +595,7 @@
boolean isSuper = false;
StringBuffer advicesUpdatedCode = new StringBuffer();
+ StringBuffer initialiseInfosForInstanceCode = new StringBuffer();
while (true)
{
@@ -632,7 +625,7 @@
infoClassName.equals(MethodByMethodInfo.class.getName()))
{
String code = infoName + " = super.copyInfoFromClassAdvisor(((" + genadvisor.getName() + ")" + clazz.getName() + "." + GET_CLASS_ADVISOR + "())." + infoName + ");";
- addCodeToInitialiseMethod(genInstanceAdvisor, code, INITIALISE_INFOS_FOR_INSTANCE);
+ initialiseInfosForInstanceCode.append(code);
}
}
@@ -645,7 +638,13 @@
superClass = superClass.getSuperclass();
superAdvisor = superAdvisor.getSuperclass();
}
-
+
+ if (initialiseInfosForInstanceCode.length() > 0)
+ {
+ initialiseInfosForInstanceCode.insert(0, genadvisor.getName() + " classAdvisor = (" + genadvisor.getName() + ")" + clazz.getName() + "." + GET_CLASS_ADVISOR + "();");
+ }
+ addCodeToInitialiseMethod(genInstanceAdvisor, initialiseInfosForInstanceCode.toString(), INITIALISE_INFOS_FOR_INSTANCE);
+
CtMethod advicesUpdated = genInstanceAdvisor.getDeclaredMethod(ADVICES_UPDATED);
advicesUpdated.insertAfter(advicesUpdatedCode.toString());
}
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java 2007-04-19 20:54:01 UTC (rev 62431)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java 2007-04-19 20:59:56 UTC (rev 62432)
@@ -21,6 +21,7 @@
*/
package org.jboss.aop.instrument;
+import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.security.AccessController;
@@ -58,6 +59,7 @@
import org.jboss.aop.pointcut.ast.ClassExpression;
import org.jboss.aop.util.JavassistUtils;
import org.jboss.aop.util.ReflectToJavassist;
+import org.jboss.util.collection.temp.WeakValueHashMap;
/**
* Creates the Joinpoint invocation replacement classes used with Generated advisors
@@ -97,6 +99,11 @@
private boolean initialised;
private ThreadLocal<Set<Integer>> inconsistentTypeArgs;
+ /**
+ * A cache of the generated joinpoint classes indexed by the interceptor chains for the info
+ */
+ private HashMap generatedJoinPointClassCache = new HashMap();
+
protected JoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info,
JoinPointParameters parameters, int argumentsSize)
{
@@ -184,6 +191,7 @@
{
throw new RuntimeException("GeneratedAdvisor weaving in AOP 2.0.0.aplha5 and later is not compatible with that of previous versions");
}
+
if (System.getSecurityManager() == null)
{
GenerateJoinPointClassAction.NON_PRIVILEGED.generateJoinPointClass(classloader, this, info);
@@ -207,13 +215,26 @@
classloader = Thread.currentThread().getContextClassLoader();
}
- AspectManager manager = AspectManager.instance();
- //ClassPool pool = manager.findClassPool(Thread.currentThread().getContextClassLoader());
- ClassPool pool = manager.findClassPool(classloader);
- GeneratedClassInfo generatedClass = generateJoinpointClass(pool, info);
+ //Attempt to get the cached information so we don't have to recreate the class every time we rebind the joinpoint
+ String infoAdviceString = info.getAdviceString();
+ GeneratedClassInfo generatedClass = (GeneratedClassInfo)generatedJoinPointClassCache.get(infoAdviceString);
+ Class clazz = null;
+ if (generatedClass != null)
+ {
+ clazz = classloader.loadClass(generatedClass.getGenerated().getName());
+ }
- ProtectionDomain pd = advisorClass.getProtectionDomain();
- Class clazz = toClass(pool, generatedClass.getGenerated(), pd);
+ if (clazz == null)
+ {
+ //We need to do all the work again
+ AspectManager manager = AspectManager.instance();
+ ClassPool pool = manager.findClassPool(classloader);
+ generatedClass = generateJoinpointClass(pool, info);
+
+ ProtectionDomain pd = advisorClass.getProtectionDomain();
+ clazz = toClass(pool, generatedClass.getGenerated(), pd);
+ generatedJoinPointClassCache.put(infoAdviceString, generatedClass);
+ }
Object obj = instantiateClass(clazz, generatedClass.getAroundSetups(), info);
joinpointField.set(info.getAdvisor(), obj);
@@ -244,7 +265,7 @@
catch (Exception e)
{
StringBuffer sb = new StringBuffer();
- throw new RuntimeException(debugClass(sb, clazz).toString());
+ throw new RuntimeException(debugClass(sb, clazz).toString(), e);
}
for (int i = 0 ; i < aroundSetups.length ; i++)
More information about the jboss-cvs-commits
mailing list