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