You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2023/09/17 14:28:46 UTC

svn commit: r1912364 - /pdfbox/trunk/io/src/main/java/org/apache/pdfbox/io/RandomAccessReadBuffer.java

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);
     }
 
     /**