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