Author: lehmi
Date: Sun Sep 17 14:28:46 2023
New Revision: 1912364

URL: http://svn.apache.org/viewvc?rev=1912364&view=rev
Log:
PDFBOX-5685: adapt the thread safe buffer cache from 
RandomAccessReadBufferedFile to reduce the memory footprint

Modified:
    
pdfbox/trunk/io/src/main/java/org/apache/pdfbox/io/RandomAccessReadBuffer.java

Modified: 
pdfbox/trunk/io/src/main/java/org/apache/pdfbox/io/RandomAccessReadBuffer.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/io/src/main/java/org/apache/pdfbox/io/RandomAccessReadBuffer.java?rev=1912364&r1=1912363&r2=1912364&view=diff
==============================================================================
--- 
pdfbox/trunk/io/src/main/java/org/apache/pdfbox/io/RandomAccessReadBuffer.java 
(original)
+++ 
pdfbox/trunk/io/src/main/java/org/apache/pdfbox/io/RandomAccessReadBuffer.java 
Sun Sep 17 14:28:46 2023
@@ -21,6 +21,8 @@ import java.io.InputStream;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 /**
  * An implementation of the RandomAccessRead interface to store data in 
memory. The data will be stored in chunks
@@ -47,6 +49,9 @@ public class RandomAccessReadBuffer impl
     // maximum chunk list index
     private int bufferListMaxIndex = 0;
 
+    // map holding all copies of the current buffer
+    private final ConcurrentMap<Long, RandomAccessReadBuffer> rarbCopies = new 
ConcurrentHashMap<>();
+
     /**
      * Default constructor.
      */
@@ -145,6 +150,8 @@ public class RandomAccessReadBuffer impl
     @Override
     public void close() throws IOException
     {
+        rarbCopies.values().forEach(IOUtils::closeQuietly);
+        rarbCopies.clear();
         currentBuffer = null;
         bufferList.clear();
     }
@@ -362,8 +369,14 @@ public class RandomAccessReadBuffer impl
     @Override
     public RandomAccessReadView createView(long startPosition, long 
streamLength) throws IOException
     {
-        return new RandomAccessReadView(new RandomAccessReadBuffer(this), 
startPosition,
-                streamLength, true);
+        Long currentThreadID = Thread.currentThread().getId();
+        RandomAccessReadBuffer randomAccessReadBuffer = 
rarbCopies.get(currentThreadID);
+        if (randomAccessReadBuffer == null || 
randomAccessReadBuffer.isClosed())
+        {
+            randomAccessReadBuffer = new RandomAccessReadBuffer(this);
+            rarbCopies.put(currentThreadID, randomAccessReadBuffer);
+        }
+        return new RandomAccessReadView(randomAccessReadBuffer, startPosition, 
streamLength);
     }
 
     /**


Reply via email to