Author: markt
Date: Thu Sep  3 14:00:09 2015
New Revision: 1701027

URL: http://svn.apache.org/r1701027
Log:
Experiment with a static cache of C2BConverter objects rather than a per 
request cache that gets cleared every time the request switches to async mode.

Modified:
    tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
    tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java
    tomcat/trunk/java/org/apache/catalina/connector/Response.java
    tomcat/trunk/java/org/apache/tomcat/util/buf/C2BConverter.java

Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=1701027&r1=1701026&r2=1701027&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Thu Sep  
3 14:00:09 2015
@@ -308,7 +308,6 @@ public class CoyoteAdapter implements Ad
                 // Clear converters so that the minimum amount of memory
                 // is used by this processor
                 request.clearEncoders();
-                response.clearEncoders();
             }
         }
         return success;
@@ -409,7 +408,6 @@ public class CoyoteAdapter implements Ad
                 // Clear converters so that the minimum amount of memory
                 // is used by this processor
                 request.clearEncoders();
-                response.clearEncoders();
             }
         }
 

Modified: tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java?rev=1701027&r1=1701026&r2=1701027&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java Thu Sep  
3 14:00:09 2015
@@ -34,6 +34,7 @@ import org.apache.tomcat.util.buf.B2CCon
 import org.apache.tomcat.util.buf.ByteChunk;
 import org.apache.tomcat.util.buf.C2BConverter;
 import org.apache.tomcat.util.buf.CharChunk;
+import org.apache.tomcat.util.collections.SynchronizedStack;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -49,10 +50,14 @@ public class OutputBuffer extends Writer
 
     private static final StringManager sm = 
StringManager.getManager(OutputBuffer.class);
 
-    // -------------------------------------------------------------- Constants
-
     public static final int DEFAULT_BUFFER_SIZE = 8*1024;
 
+    /**
+     * Encoder cache.
+     */
+    private static final ConcurrentHashMap<Charset, 
SynchronizedStack<C2BConverter>> encoders =
+            new ConcurrentHashMap<>();
+
 
     // ----------------------------------------------------- Instance Variables
 
@@ -117,12 +122,6 @@ public class OutputBuffer extends Writer
 
 
     /**
-     * List of encoders.
-     */
-    protected final ConcurrentHashMap<Charset, C2BConverter> encoders = new 
ConcurrentHashMap<>();
-
-
-    /**
      * Current char to byte converter.
      */
     protected C2BConverter conv;
@@ -234,6 +233,7 @@ public class OutputBuffer extends Writer
 
         if (conv != null) {
             conv.recycle();
+            encoders.get(conv.getCharset()).push(conv);
             conv = null;
         }
 
@@ -242,14 +242,6 @@ public class OutputBuffer extends Writer
 
 
     /**
-     * Clear cached encoders (to save memory for async requests).
-     */
-    public void clearEncoders() {
-        encoders.clear();
-    }
-
-
-    /**
      * Close the output buffer. This tries to calculate the response size if
      * the response has not been committed yet.
      *
@@ -567,11 +559,16 @@ public class OutputBuffer extends Writer
         }
 
         final Charset charset = B2CConverter.getCharset(enc);
-        conv = encoders.get(charset);
+        SynchronizedStack<C2BConverter> stack = encoders.get(charset);
+        if (stack == null) {
+            stack = new SynchronizedStack<>();
+            encoders.putIfAbsent(charset, stack);
+            stack = encoders.get(charset);
+        }
+        conv = stack.pop();
 
         if (conv == null) {
             conv = createNewConverter(charset);
-            encoders.put(charset, conv);
         }
     }
 
@@ -635,6 +632,10 @@ public class OutputBuffer extends Writer
         bytesWritten = 0;
         charsWritten = 0;
         if (resetWriterStreamFlags) {
+            if (conv != null) {
+                conv.recycle();
+                encoders.get(conv.getCharset()).push(conv);
+            }
             conv = null;
             enc = null;
         }

Modified: tomcat/trunk/java/org/apache/catalina/connector/Response.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Response.java?rev=1701027&r1=1701026&r2=1701027&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Response.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Response.java Thu Sep  3 
14:00:09 2015
@@ -287,17 +287,8 @@ public class Response
     }
 
 
-    /**
-     * Clear cached encoders (to save memory for async requests).
-     */
-    public void clearEncoders() {
-        outputBuffer.clearEncoders();
-    }
-
-
     // ------------------------------------------------------- Response Methods
 
-
     /**
      * Return the number of bytes the application has actually written to the
      * output stream. This excludes chunking, compression, etc. as well as

Modified: tomcat/trunk/java/org/apache/tomcat/util/buf/C2BConverter.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/buf/C2BConverter.java?rev=1701027&r1=1701026&r2=1701027&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/buf/C2BConverter.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/buf/C2BConverter.java Thu Sep  3 
14:00:09 2015
@@ -124,4 +124,7 @@ public final class C2BConverter {
         }
     }
 
+    public Charset getCharset() {
+        return encoder.charset();
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to