[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