[jboss-cvs] JBossAS SVN: r62288 - in projects/aop/trunk/aop/src: main/org/jboss/aop/util and 1 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Apr 11 15:10:12 EDT 2007
Author: kabir.khan at jboss.com
Date: 2007-04-11 15:10:12 -0400 (Wed, 11 Apr 2007)
New Revision: 62288
Modified:
projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java
projects/aop/trunk/aop/src/main/org/jboss/aop/Domain.java
projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java
projects/aop/trunk/aop/src/main/org/jboss/aop/util/MethodHashing.java
projects/aop/trunk/aop/src/resources/test/stress/config.properties
Log:
[JBAOP-378] Since Domain.hasOwnDataWithEffectOnAdvices() is called A LOT, cache the data rather than querying the underlying hashmaps for their size each time.
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java 2007-04-11 19:08:43 UTC (rev 62287)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/AspectManager.java 2007-04-11 19:10:12 UTC (rev 62288)
@@ -1438,6 +1438,11 @@
public void removeClassMetaData(String name)
{
+ internalRemoveClassMetaData(name);
+ }
+
+ public void internalRemoveClassMetaData(String name)
+ {
synchronized (classMetaData)
{
ClassMetaDataBinding meta = (ClassMetaDataBinding) classMetaData.remove(name);
@@ -1448,7 +1453,7 @@
public void addClassMetaData(ClassMetaDataBinding meta)
{
- removeClassMetaData(meta.getName());
+ internalRemoveClassMetaData(meta.getName());
//Add the metadata before we update the advisors. Important for the generated instance advisors
initClassMetaDataMap();
@@ -1907,12 +1912,12 @@
}
}
- public void setBindings(LinkedHashMap bindings)
- {
- initBindingsMap();
- this.bindings.clear();
- this.bindings.putAll(bindings);
- }
+// public void setBindings(LinkedHashMap bindings)
+// {
+// initBindingsMap();
+// this.bindings.clear();
+// this.bindings.putAll(bindings);
+// }
public void addSubDomainPerClass(Class clazz, Domain domain)
{
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/Domain.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/Domain.java 2007-04-11 19:08:43 UTC (rev 62287)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/Domain.java 2007-04-11 19:10:12 UTC (rev 62288)
@@ -30,9 +30,14 @@
import java.util.List;
import java.util.Map;
+import org.jboss.aop.advice.AdviceBinding;
import org.jboss.aop.advice.AdviceStack;
import org.jboss.aop.advice.AspectDefinition;
import org.jboss.aop.advice.InterceptorFactory;
+import org.jboss.aop.advice.PrecedenceDef;
+import org.jboss.aop.introduction.AnnotationIntroduction;
+import org.jboss.aop.introduction.InterfaceIntroduction;
+import org.jboss.aop.metadata.ClassMetaDataBinding;
import org.jboss.aop.metadata.ClassMetaDataLoader;
import org.jboss.aop.microcontainer.lifecycle.LifecycleCallbackBinding;
import org.jboss.aop.pointcut.CFlowStack;
@@ -57,6 +62,17 @@
protected boolean inheritsDeclarations = true;
protected boolean inheritsBindings = false;
+ //Calculating the size of the collections containing this information is timeconsuming, we
+ //only want to do this when adding/removing stuff
+ protected boolean hasOwnPointcuts;
+ protected boolean hasOwnBindings;
+ protected boolean hasOwnAnnotationIntroductions;
+ protected boolean hasOwnAnnotationOverrides;
+ protected boolean hasOwnInterfaceIntroductions;
+ protected boolean hasOwnTypedefs;
+ protected boolean hasOwnPrecedenceDefs;
+ protected boolean hasOwnClassMetaData;
+
public Domain(AspectManager manager, String name, boolean parentFirst)
{
this.parent = manager;
@@ -121,12 +137,7 @@
}
}
-
- public void removeBindings(ArrayList binds)
- {
- super.removeBindings(binds);
- }
-
+ @Override
public LinkedHashMap getBindings()
{
if (inheritsBindings)
@@ -150,9 +161,32 @@
public boolean hasOwnBindings()
{
- return super.bindings.size() > 0;
+ return hasOwnBindings;
}
+ @Override
+ public synchronized void addBinding(AdviceBinding binding)
+ {
+ hasOwnPointcuts = true;
+ hasOwnBindings = true;
+ super.addBinding(binding);
+ }
+
+ @Override
+ public synchronized void removeBinding(String name)
+ {
+ super.removeBinding(name);
+ hasOwnBindings = bindings.size() > 0;
+ }
+
+ @Override
+ public synchronized void removeBindings(ArrayList binds)
+ {
+ super.removeBindings(binds);
+ hasOwnBindings = bindings.size() > 0;
+ hasOwnPointcuts = bindings.size() > 0;
+ }
+
public LinkedHashMap getPointcuts()
{
if (inheritsBindings)
@@ -176,9 +210,24 @@
public boolean hasOwnPointcuts()
{
- return super.pointcuts.size() > 0;
+ return hasOwnPointcuts;
}
+
+ @Override
+ public synchronized void addPointcut(Pointcut pointcut)
+ {
+ hasOwnPointcuts = true;
+ super.addPointcut(pointcut);
+ }
+ @Override
+ public void removePointcut(String name)
+ {
+ super.removePointcut(name);
+ hasOwnPointcuts = pointcuts.size() > 0;
+ }
+
+ @Override
public LinkedHashMap getPointcutInfos()
{
if (inheritsBindings)
@@ -200,6 +249,7 @@
return super.getPointcutInfos();
}
+ @Override
public List getAnnotationIntroductions()
{
@@ -232,9 +282,24 @@
public boolean hasOwnAnnotationIntroductions()
{
- return super.annotationIntroductions.size() > 0;
+ return hasOwnAnnotationIntroductions;
}
+ @Override
+ public synchronized void addAnnotationIntroduction(AnnotationIntroduction pointcut)
+ {
+ hasOwnAnnotationIntroductions = true;
+ super.addAnnotationIntroduction(pointcut);
+ }
+
+ @Override
+ public void removeAnnotationIntroduction(AnnotationIntroduction pointcut)
+ {
+ super.removeAnnotationIntroduction(pointcut);
+ hasOwnAnnotationIntroductions = annotationIntroductions.size() > 0;
+ }
+
+ @Override
public List getAnnotationOverrides()
{
if (inheritsBindings)
@@ -265,9 +330,24 @@
public boolean hasOwnAnnotationOverrides()
{
- return super.annotationOverrides.size() > 0;
+ return hasOwnAnnotationOverrides;
}
+ @Override
+ public synchronized void addAnnotationOverride(AnnotationIntroduction pointcut)
+ {
+ hasOwnAnnotationOverrides = true;
+ super.addAnnotationOverride(pointcut);
+ }
+
+ @Override
+ public void removeAnnotationOverride(AnnotationIntroduction pointcut)
+ {
+ super.removeAnnotationOverride(pointcut);
+ hasOwnAnnotationOverrides = annotationOverrides.size() > 0;
+ }
+
+ @Override
public Map getInterfaceIntroductions()
{
if (inheritsBindings)
@@ -296,12 +376,26 @@
return super.getInterfaceIntroductions();
}
-
public boolean hasOwnInterfaceIntroductions()
{
- return super.annotationIntroductions.size() > 0;
+ return hasOwnInterfaceIntroductions;
}
+ @Override
+ public synchronized void addInterfaceIntroduction(InterfaceIntroduction pointcut)
+ {
+ hasOwnInterfaceIntroductions = true;
+ super.addInterfaceIntroduction(pointcut);
+ }
+
+ @Override
+ public void removeInterfaceIntroduction(String name)
+ {
+ super.removeInterfaceIntroduction(name);
+ hasOwnInterfaceIntroductions = interfaceIntroductions.size() > 0;
+ }
+
+ @Override
public Map getTypedefs()
{
if (inheritsBindings)
@@ -333,9 +427,23 @@
public boolean hasOwnTypedefs()
{
- return super.annotationIntroductions.size() > 0;
+ return hasOwnTypedefs;
}
+ @Override
+ public synchronized void addTypedef(Typedef def) throws Exception
+ {
+ hasOwnTypedefs = true;
+ super.addTypedef(def);
+ }
+
+ @Override
+ public void removeTypedef(String name)
+ {
+ super.removeTypedef(name);
+ hasOwnTypedefs = typedefs.size() > 0;
+ }
+
public Map getInterceptorStacks()
{
if (inheritsBindings)
@@ -476,6 +584,7 @@
return super.getPerVMAspects();
}
+ @Override
public LinkedHashMap getPrecedenceDefs()
{
if (inheritsDeclarations)
@@ -499,9 +608,24 @@
public boolean hasOwnPrecedenceDefs()
{
- return super.precedenceDefs.size() > 0;
+ return hasOwnPrecedenceDefs;
}
+ @Override
+ public void addPrecedence(PrecedenceDef precedenceDef)
+ {
+ hasOwnPrecedenceDefs = true;
+ super.addPrecedence(precedenceDef);
+ }
+
+ @Override
+ public void removePrecedence(String name)
+ {
+ super.removePrecedence(name);
+ hasOwnPrecedenceDefs = precedenceDefs.size() > 0;
+ }
+
+ @Override
public Map getClassMetaData()
{
if (inheritsBindings)
@@ -532,19 +656,33 @@
public boolean hasOwnClassMetaData()
{
- return super.classMetaData.size() > 0;
+ return hasOwnClassMetaData;
}
+ @Override
+ public void removeClassMetaData(String name)
+ {
+ super.removeClassMetaData(name);
+ hasOwnClassMetaData = classMetaData.size() > 0;
+ }
+
+ @Override
+ public void addClassMetaData(ClassMetaDataBinding meta)
+ {
+ hasOwnClassMetaData = true;
+ super.addClassMetaData(meta);
+ }
+
public boolean hasOwnDataWithEffectOnAdvices()
{
- return hasOwnBindings() ||
- hasOwnPointcuts() ||
- hasOwnAnnotationIntroductions() ||
- hasOwnAnnotationOverrides() ||
- hasOwnInterfaceIntroductions() ||
- hasOwnTypedefs() ||
- hasOwnPrecedenceDefs() ||
- hasOwnClassMetaData();
+ return hasOwnBindings ||
+ hasOwnPointcuts ||
+ hasOwnAnnotationIntroductions ||
+ hasOwnAnnotationOverrides ||
+ hasOwnInterfaceIntroductions ||
+ hasOwnTypedefs ||
+ hasOwnPrecedenceDefs ||
+ hasOwnClassMetaData;
}
public InterceptorFactory getInterceptorFactory(String name)
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java 2007-04-11 19:08:43 UTC (rev 62287)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java 2007-04-11 19:10:12 UTC (rev 62288)
@@ -141,7 +141,7 @@
* Callback for instance advisors to rebuild their interceptors when their
* version number is out of sync
*/
- protected void internalRebuildInterceptors()
+ protected synchronized void internalRebuildInterceptors()
{
super.rebuildInterceptors();
}
@@ -1281,7 +1281,7 @@
}
- public void rebuildInterceptors()
+ public synchronized void rebuildInterceptors()
{
if (getClassAdvisorIfInstanceAdvisorWithNoOwnDataWithEffectOnAdvices() != null && GeneratedClassAdvisor.this.version != parent.version)
{
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/util/MethodHashing.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/util/MethodHashing.java 2007-04-11 19:08:43 UTC (rev 62287)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/util/MethodHashing.java 2007-04-11 19:10:12 UTC (rev 62288)
@@ -31,6 +31,7 @@
import java.util.Map;
import java.util.WeakHashMap;
+import org.jboss.aop.util.reference.ConstructorPersistentReference;
import org.jboss.aop.util.reference.MethodPersistentReference;
import org.jboss.aop.util.reference.PersistentReference;
@@ -45,9 +46,10 @@
// Constants -----------------------------------------------------
// Static --------------------------------------------------------
- static Map hashMap = new WeakHashMap();
+ static Map methodHashesByName = new WeakHashMap();
static Map methodHashesByClass = new WeakHashMap();
+ static Map constructorHashesByClass = new WeakHashMap();
public static Method findMethodByHash(Class clazz, long hash) throws Exception
{
@@ -85,15 +87,31 @@
public static Constructor findConstructorByHash(Class clazz, long hash) throws Exception
{
- Constructor[] cons = SecurityActions.getDeclaredConstructors(clazz);
- for (int i = 0; i < cons.length; i++)
+ return findConstructorByHash(clazz, new Long(hash));
+ }
+
+ public static Constructor findConstructorByHash(Class clazz, Long hash) throws Exception
+ {
+ Map hashes = getConstructorHashes(clazz);
+ ConstructorPersistentReference ref = (ConstructorPersistentReference)hashes.get(hash);
+ if (ref != null)
{
- if (constructorHash(cons[i]) == hash) return cons[i];
+ return ref.getConstructor();
}
if (clazz.getSuperclass() != null)
{
- return findConstructorByHash(clazz.getSuperclass(), hash);
+ return findConstructorByHash(clazz, hash);
}
+
+// Constructor[] cons = SecurityActions.getDeclaredConstructors(clazz);
+// for (int i = 0; i < cons.length; i++)
+// {
+// if (constructorHash(cons[i]) == hash) return cons[i];
+// }
+// if (clazz.getSuperclass() != null)
+// {
+// return findConstructorByHash(clazz.getSuperclass(), hash);
+// }
return null;
}
@@ -187,7 +205,7 @@
*/
public static long calculateHash(Method method)
{
- Map methodHashes = (Map)hashMap.get(method.getDeclaringClass());
+ Map methodHashes = (Map)methodHashesByName.get(method.getDeclaringClass());
if (methodHashes == null)
{
@@ -195,9 +213,9 @@
// Copy and add
WeakHashMap newHashMap = new WeakHashMap();
- newHashMap.putAll(hashMap);
+ newHashMap.putAll(methodHashesByName);
newHashMap.put(method.getDeclaringClass(), methodHashes);
- hashMap = newHashMap;
+ methodHashesByName = newHashMap;
}
return ((Long)methodHashes.get(method.toString())).longValue();
@@ -250,10 +268,9 @@
HashMap map = new HashMap();
for (int i = 0; i < methods.length; i++)
{
- Method method = methods[i];
try
{
- long hash = methodHash(method);
+ long hash = methodHash(methods[i]);
//Use Clebert's Persistent References so we don't get memory leaks
map.put(new Long(hash), new MethodPersistentReference(methods[i], PersistentReference.REFERENCE_SOFT));
}
@@ -264,4 +281,36 @@
return map;
}
+
+ private static Map getConstructorHashes(Class clazz)
+ {
+ Map constructorHashes = (Map)constructorHashesByClass.get(clazz);
+ if (constructorHashes == null)
+ {
+ constructorHashes = getConstructorHashMap(clazz);
+ constructorHashesByClass.put(clazz, constructorHashes);
+ }
+ return constructorHashes;
+ }
+
+ private static Map getConstructorHashMap(Class clazz)
+ {
+ // Create method hashes
+ Constructor[] constructors = SecurityActions.getDeclaredConstructors(clazz);
+ HashMap map = new HashMap();
+ for (int i = 0; i < constructors.length; i++)
+ {
+ try
+ {
+ long hash = constructorHash(constructors[i]);
+ //Use Clebert's Persistent References so we don't get memory leaks
+ map.put(new Long(hash), new ConstructorPersistentReference(constructors[i], PersistentReference.REFERENCE_SOFT));
+ }
+ catch (Exception e)
+ {
+ }
+ }
+
+ return map;
+ }
}
Modified: projects/aop/trunk/aop/src/resources/test/stress/config.properties
===================================================================
--- projects/aop/trunk/aop/src/resources/test/stress/config.properties 2007-04-11 19:08:43 UTC (rev 62287)
+++ projects/aop/trunk/aop/src/resources/test/stress/config.properties 2007-04-11 19:10:12 UTC (rev 62288)
@@ -1,5 +1,5 @@
-warmup=10000
-loops=50000
+warmup=0
+loops=1000
threads=1
random_sleep_interval=false
sleeptime_millis=0
More information about the jboss-cvs-commits
mailing list