You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@velocity.apache.org by nb...@apache.org on 2008/07/26 00:56:14 UTC

svn commit: r679920 - in /velocity/engine/trunk/src/java/org/apache/velocity/runtime: VelocimacroFactory.java directive/RuntimeMacro.java

Author: nbubna
Date: Fri Jul 25 15:56:14 2008
New Revision: 679920

URL: http://svn.apache.org/viewvc?rev=679920&view=rev
Log:
VELOCITY-607 use more fine-grained synchronization in to reduce needless thread blocking (and a few other minor perf tweaks)

Modified:
    velocity/engine/trunk/src/java/org/apache/velocity/runtime/VelocimacroFactory.java
    velocity/engine/trunk/src/java/org/apache/velocity/runtime/directive/RuntimeMacro.java

Modified: velocity/engine/trunk/src/java/org/apache/velocity/runtime/VelocimacroFactory.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/src/java/org/apache/velocity/runtime/VelocimacroFactory.java?rev=679920&r1=679919&r2=679920&view=diff
==============================================================================
--- velocity/engine/trunk/src/java/org/apache/velocity/runtime/VelocimacroFactory.java (original)
+++ velocity/engine/trunk/src/java/org/apache/velocity/runtime/VelocimacroFactory.java Fri Jul 25 15:56:14 2008
@@ -484,22 +484,19 @@
      */
     public Directive getVelocimacro(String vmName, String sourceTemplate)
     {
-        VelocimacroProxy vp = null;
-
-        synchronized(this)
+        VelocimacroProxy vp = vmManager.get(vmName, sourceTemplate);
+        if (vp == null)
         {
-            /*
-             *  don't ask - do
-             */
-
-            vp = vmManager.get(vmName, sourceTemplate);
+            return null;
+        }
 
+        synchronized(vp)
+        {
             /*
              *  if this exists, and autoload is on, we need to check
              *  where this VM came from
              */
-
-            if (vp != null && getAutoload())
+            if (getAutoload())
             {
                 /*
                  *  see if this VM came from a library.  Need to pass sourceTemplate

Modified: velocity/engine/trunk/src/java/org/apache/velocity/runtime/directive/RuntimeMacro.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/src/java/org/apache/velocity/runtime/directive/RuntimeMacro.java?rev=679920&r1=679919&r2=679920&view=diff
==============================================================================
--- velocity/engine/trunk/src/java/org/apache/velocity/runtime/directive/RuntimeMacro.java (original)
+++ velocity/engine/trunk/src/java/org/apache/velocity/runtime/directive/RuntimeMacro.java Fri Jul 25 15:56:14 2008
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+import org.apache.commons.lang.text.StrBuilder;
 import org.apache.velocity.context.InternalContextAdapter;
 import org.apache.velocity.runtime.parser.node.Node;
 import org.apache.velocity.runtime.parser.Token;
@@ -124,26 +125,35 @@
         this.context = context;
         this.node = node;
 
-        StringBuffer buffer = new StringBuffer();
         Token t = node.getFirstToken();
 
-        /**
-         * Retrieve the literal text
-         */
-        while (t != null && t != node.getLastToken())
+        if (t == node.getLastToken())
         {
-            buffer.append(t.image);
-            t = t.next;
+            literal = t.image;
         }
-
-        if (t != null)
+        else
         {
-            buffer.append(t.image);
+            // guessing that most macros are much longer than
+            // the 32 char default capacity.  let's guess 4x bigger :)
+            StrBuilder text = new StrBuilder(128);
+            /**
+             * Retrieve the literal text
+             */
+            while (t != null && t != node.getLastToken())
+            {
+                text.append(t.image);
+                t = t.next;
+            }
+            if (t != null)
+            {
+                text.append(t.image);
+            }
+
+            /**
+             * Store the literal text
+             */
+            literal = text.toString();
         }
-        /**
-         * Store the literal text
-         */
-        literal = buffer.toString();
     }
 
     /**
@@ -174,8 +184,7 @@
         /**
          * first look in the source template
          */
-        Object o = rsvc.getVelocimacro(macroName,
-                sourceTemplate);
+        Object o = rsvc.getVelocimacro(macroName, sourceTemplate);
         if (o != null && o instanceof VelocimacroProxy)
         {
             vmProxy = (VelocimacroProxy)o;
@@ -213,9 +222,13 @@
              */
             try
             {
-                synchronized(this)
+                synchronized (vmProxy)
                 {
                     vmProxy.init(rsvc, this.context, this.node);
+                    /**
+                     * render it
+                     */
+                    return vmProxy.render(context, writer, node);
                 }
             }
             catch (TemplateInitException die)
@@ -224,10 +237,6 @@
 
                 throw new ParseErrorException(die.getMessage(), info);
             }
-            /**
-             * render it
-             */
-            return vmProxy.render(context, writer, node);
         }
 
         /**