You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by mr...@apache.org on 2006/09/13 22:43:26 UTC

svn commit: r443115 - /xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java

Author: mrglavas
Date: Wed Sep 13 13:43:26 2006
New Revision: 443115

URL: http://svn.apache.org/viewvc?view=rev&rev=443115
Log:
Reduce the overhead of creating a ScannedEntity by reusing byte buffers.
This is similar to the improvement introduced in Rev 320110.

See: http://svn.apache.org/viewvc?view=rev&revision=320110

Modified:
    xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java

Modified: xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java
URL: http://svn.apache.org/viewvc/xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java?view=diff&rev=443115&r1=443114&r2=443115
==============================================================================
--- xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java (original)
+++ xerces/java/trunk/src/org/apache/xerces/impl/XMLEntityManager.java Wed Sep 13 13:43:26 2006
@@ -356,6 +356,9 @@
     /** Pool of byte buffers. */
     private final ByteBufferPool fByteBufferPool = new ByteBufferPool(fBufferSize);
     
+    /** Temporary storage for the current entity's byte buffer. */
+    private byte[] fTempByteBuffer = null;
+    
     /** Pool of character buffers. */
     private final CharacterBufferPool fCharacterBufferPool = new CharacterBufferPool(fBufferSize, DEFAULT_INTERNAL_BUFFER_SIZE);
 
@@ -378,7 +381,6 @@
      */
     public XMLEntityManager(XMLEntityManager entityManager) {
 
-
         // save shared entity declarations
         fDeclaredEntities = entityManager != null
                           ? entityManager.getDeclaredEntities() : null;
@@ -923,6 +925,7 @@
         String encoding = xmlInputSource.getEncoding();
         final boolean encodingExternallySpecified = (encoding != null);
         Boolean isBigEndian = null;
+        fTempByteBuffer = null;
 
         // create reader
         InputStream stream = null;
@@ -1463,6 +1466,7 @@
                     bufferSize.intValue() > DEFAULT_XMLDECL_BUFFER_SIZE) {
                     fBufferSize = bufferSize.intValue();
                     fEntityScanner.setBufferSize(fBufferSize);
+                    fByteBufferPool.setBufferSize(fBufferSize);
                     fCharacterBufferPool.setExternalBufferSize(fBufferSize);
                 }
             }
@@ -1884,8 +1888,13 @@
             fReaderStack.pop();
         } 
 
-        //Release the character buffer back to the pool for reuse
-        fCharacterBufferPool.returnToPool(fCurrentEntity.fBuffer);
+        // Release the character buffer back to the pool for reuse
+        fCharacterBufferPool.returnBuffer(fCurrentEntity.fCharacterBuffer);
+        
+        // Release the byte buffer back to the pool for reuse
+        if (fCurrentEntity.fByteBuffer != null) {
+            fByteBufferPool.returnBuffer(fCurrentEntity.fByteBuffer);
+        }
         
         // Pop entity stack.
         fCurrentEntity = fEntityStack.size() > 0
@@ -2011,7 +2020,10 @@
             if (DEBUG_ENCODINGS) {
                 System.out.println("$$$ creating UTF8Reader");
             }
-            return new UTF8Reader(inputStream, fBufferSize, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale());
+            if (fTempByteBuffer == null) {
+                fTempByteBuffer = fByteBufferPool.getBuffer();
+            }
+            return new UTF8Reader(inputStream, fTempByteBuffer, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale());
         }
 
         // try to use an optimized reader
@@ -2020,7 +2032,10 @@
             if (DEBUG_ENCODINGS) {
                 System.out.println("$$$ creating UTF8Reader");
             }
-            return new UTF8Reader(inputStream, fBufferSize, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale());
+            if (fTempByteBuffer == null) {
+                fTempByteBuffer = fByteBufferPool.getBuffer();
+            }
+            return new UTF8Reader(inputStream, fTempByteBuffer, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale());
         }
         if(ENCODING.equals("ISO-10646-UCS-4")) {
             if(isBigEndian != null) {
@@ -2078,9 +2093,10 @@
         // try to use a Java reader
         String javaEncoding = EncodingMap.getIANA2JavaMapping(ENCODING);
         if (javaEncoding == null) {
-            if(fAllowJavaEncodings) {
-            javaEncoding = encoding;
-            } else {
+            if (fAllowJavaEncodings) {
+                javaEncoding = encoding;
+            } 
+            else {
                 fErrorReporter.reportError(XMLMessageFormatter.XML_DOMAIN,
                                        "EncodingDeclInvalid",
                                        new Object[] { encoding },
@@ -2089,20 +2105,29 @@
                 if (DEBUG_ENCODINGS) {
                     System.out.println("$$$ creating Latin1Reader");
                 }
-                return new Latin1Reader(inputStream, fBufferSize);
+                if (fTempByteBuffer == null) {
+                    fTempByteBuffer = fByteBufferPool.getBuffer();
+                }
+                return new Latin1Reader(inputStream, fTempByteBuffer);
             }
         }
         else if (javaEncoding.equals("ASCII")) {
             if (DEBUG_ENCODINGS) {
                 System.out.println("$$$ creating ASCIIReader");
             }
-            return new ASCIIReader(inputStream, fBufferSize, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale());
+            if (fTempByteBuffer == null) {
+                fTempByteBuffer = fByteBufferPool.getBuffer();
+            }
+            return new ASCIIReader(inputStream, fTempByteBuffer, fErrorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN), fErrorReporter.getLocale());
         }
         else if (javaEncoding.equals("ISO8859_1")) {
             if (DEBUG_ENCODINGS) {
                 System.out.println("$$$ creating Latin1Reader");
             }
-            return new Latin1Reader(inputStream, fBufferSize);
+            if (fTempByteBuffer == null) {
+                fTempByteBuffer = fByteBufferPool.getBuffer();
+            }
+            return new Latin1Reader(inputStream, fTempByteBuffer);
         }
         if (DEBUG_ENCODINGS) {
             System.out.print("$$$ creating Java InputStreamReader: encoding="+javaEncoding);
@@ -2542,9 +2567,11 @@
         public boolean mayReadChunks;
         
         /** Character buffer container. */
-        private CharacterBuffer fBuffer;
+        private CharacterBuffer fCharacterBuffer;
+        
+        /** Byte buffer. */
+        private byte [] fByteBuffer;
         
-
         //
         // Constructors
         //
@@ -2562,8 +2589,9 @@
             this.literal = literal;
             this.mayReadChunks = mayReadChunks;
             this.isExternal = isExternal;
-            this.fBuffer = fCharacterBufferPool.getBuffer(isExternal);
-            this.ch = fBuffer.ch;
+            this.fCharacterBuffer = fCharacterBufferPool.getBuffer(isExternal);
+            this.ch = fCharacterBuffer.ch;
+            this.fByteBuffer = fTempByteBuffer;
         } // <init>(StringXMLResourceIdentifier,InputStream,Reader,String,boolean, boolean)
 
         //
@@ -2581,7 +2609,9 @@
         } // isUnparsed():boolean
 
         public void setReader(InputStream stream, String encoding, Boolean isBigEndian) throws IOException {
+            fTempByteBuffer = fByteBuffer;
             reader = createReader(stream, encoding, isBigEndian);
+            fByteBuffer = fTempByteBuffer;
         }
 
         // return the expanded system ID of the 
@@ -2850,7 +2880,7 @@
         }
         
         /** Returns buffer to pool. **/
-        public void returnToPool(CharacterBuffer buffer) {
+        public void returnBuffer(CharacterBuffer buffer) {
             if (buffer.isExternal) {
                 if (fExternalTop < fExternalBufferPool.length - 1) {
                     fExternalBufferPool[++fExternalTop] = buffer;



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org