Author: markt
Date: Thu Sep  3 19:58:03 2015
New Revision: 1701120

URL: http://svn.apache.org/r1701120
Log:
Use a static cache of B2CConverter 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/InputBuffer.java
    tomcat/trunk/java/org/apache/catalina/connector/Request.java
    tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.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=1701120&r1=1701119&r2=1701120&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Thu Sep  
3 19:58:03 2015
@@ -304,10 +304,6 @@ public class CoyoteAdapter implements Ad
             if (!success || !request.isAsync()) {
                 request.recycle();
                 response.recycle();
-            } else {
-                // Clear converters so that the minimum amount of memory
-                // is used by this processor
-                request.clearEncoders();
             }
         }
         return success;
@@ -404,13 +400,8 @@ public class CoyoteAdapter implements Ad
             if (!async || error.get()) {
                 request.recycle();
                 response.recycle();
-            } else {
-                // Clear converters so that the minimum amount of memory
-                // is used by this processor
-                request.clearEncoders();
             }
         }
-
     }
 
 

Modified: tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java?rev=1701120&r1=1701119&r2=1701120&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java Thu Sep  3 
19:58:03 2015
@@ -33,6 +33,7 @@ import org.apache.coyote.Request;
 import org.apache.tomcat.util.buf.B2CConverter;
 import org.apache.tomcat.util.buf.ByteChunk;
 import org.apache.tomcat.util.buf.CharChunk;
+import org.apache.tomcat.util.collections.SynchronizedStack;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -52,9 +53,6 @@ public class InputBuffer extends Reader
      */
     protected static final StringManager sm = 
StringManager.getManager(InputBuffer.class);
 
-
-    // -------------------------------------------------------------- Constants
-
     public static final int DEFAULT_BUFFER_SIZE = 8*1024;
 
     // The buffer can be used for byte[] and char[] reading
@@ -64,6 +62,13 @@ public class InputBuffer extends Reader
     public final int BYTE_STATE = 2;
 
 
+    /**
+     * Encoder cache.
+     */
+    private static final 
ConcurrentHashMap<Charset,SynchronizedStack<B2CConverter>> encoders =
+            new ConcurrentHashMap<>();
+
+
     // ----------------------------------------------------- Instance Variables
 
     /**
@@ -97,12 +102,6 @@ public class InputBuffer extends Reader
 
 
     /**
-     * List of encoders.
-     */
-    protected final ConcurrentHashMap<Charset,B2CConverter> encoders = new 
ConcurrentHashMap<>();
-
-
-    /**
      * Current byte to char converter.
      */
     protected B2CConverter conv;
@@ -197,6 +196,7 @@ public class InputBuffer extends Reader
 
         if (conv != null) {
             conv.recycle();
+            encoders.get(conv.getCharset()).push(conv);
             conv = null;
         }
 
@@ -205,14 +205,6 @@ public class InputBuffer extends Reader
 
 
     /**
-     * Clear cached encoders (to save memory for async requests).
-     */
-    public void clearEncoders() {
-        encoders.clear();
-    }
-
-
-    /**
      * Close the input buffer.
      *
      * @throws IOException An underlying IOException occurred
@@ -370,9 +362,7 @@ public class InputBuffer extends Reader
 
     @Override
     public int realReadChars() throws IOException {
-        if (conv == null) {
-            setConverter();
-        }
+        checkConverter();
 
         boolean eof = false;
 
@@ -545,7 +535,6 @@ public class InputBuffer extends Reader
 
 
     private void setConverter() throws IOException {
-
         if (coyoteRequest != null) {
             enc = coyoteRequest.getCharacterEncoding();
         }
@@ -555,11 +544,16 @@ public class InputBuffer extends Reader
         }
 
         Charset charset = B2CConverter.getCharset(enc);
-        conv = encoders.get(charset);
+        SynchronizedStack<B2CConverter> 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 = createConverter(charset);
-            encoders.put(charset, conv);
         }
     }
 

Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Request.java?rev=1701120&r1=1701119&r2=1701120&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Thu Sep  3 
19:58:03 2015
@@ -517,13 +517,6 @@ public class Request
         pathParameters.clear();
     }
 
-    /**
-     * Clear cached encoders (to save memory for async requests).
-     */
-    public void clearEncoders() {
-        inputBuffer.clearEncoders();
-    }
-
 
     // -------------------------------------------------------- Request Methods
 

Modified: tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java?rev=1701120&r1=1701119&r2=1701120&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/buf/B2CConverter.java Thu Sep  3 
19:58:03 2015
@@ -198,4 +198,9 @@ public class B2CConverter {
             }
         }
     }
+
+
+    public Charset getCharset() {
+        return decoder.charset();
+    }
 }



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

Reply via email to