You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@lucene.apache.org by mi...@apache.org on 2007/11/27 18:01:23 UTC
svn commit: r598693 - in
/lucene/java/trunk/src/java/org/apache/lucene/store: RAMFile.java
RAMInputStream.java RAMOutputStream.java
Author: mikemccand
Date: Tue Nov 27 09:01:21 2007
New Revision: 598693
URL: http://svn.apache.org/viewvc?rev=598693&view=rev
Log:
LUCENE-1067: make access to RAMFile's buffers thread safe
Modified:
lucene/java/trunk/src/java/org/apache/lucene/store/RAMFile.java
lucene/java/trunk/src/java/org/apache/lucene/store/RAMInputStream.java
lucene/java/trunk/src/java/org/apache/lucene/store/RAMOutputStream.java
Modified: lucene/java/trunk/src/java/org/apache/lucene/store/RAMFile.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/store/RAMFile.java?rev=598693&r1=598692&r2=598693&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/store/RAMFile.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/store/RAMFile.java Tue Nov 27 09:01:21 2007
@@ -24,8 +24,7 @@
private static final long serialVersionUID = 1l;
- // Direct read-only access to state supported for streams since a writing stream implies no other concurrent streams
- ArrayList buffers = new ArrayList();
+ private ArrayList buffers = new ArrayList();
long length;
RAMDirectory directory;
long sizeInBytes; // Only maintained if in a directory; updates synchronized on directory
@@ -58,8 +57,7 @@
this.lastModified = lastModified;
}
- // Only one writing stream with no concurrent reading streams, so no file synchronization required
- final byte[] addBuffer(int size) {
+ final synchronized byte[] addBuffer(int size) {
byte[] buffer = newBuffer(size);
if (directory!=null)
synchronized (directory) { // Ensure addition of buffer and adjustment to directory size are atomic wrt directory
@@ -70,6 +68,14 @@
else
buffers.add(buffer);
return buffer;
+ }
+
+ final synchronized byte[] getBuffer(int index) {
+ return (byte[]) buffers.get(index);
+ }
+
+ final synchronized int numBuffers() {
+ return buffers.size();
}
/**
Modified: lucene/java/trunk/src/java/org/apache/lucene/store/RAMInputStream.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/store/RAMInputStream.java?rev=598693&r1=598692&r2=598693&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/store/RAMInputStream.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/store/RAMInputStream.java Tue Nov 27 09:01:21 2007
@@ -84,11 +84,11 @@
}
private final void switchCurrentBuffer() throws IOException {
- if (currentBufferIndex >= file.buffers.size()) {
+ if (currentBufferIndex >= file.numBuffers()) {
// end of file reached, no more buffers left
throw new IOException("Read past EOF");
} else {
- currentBuffer = (byte[]) file.buffers.get(currentBufferIndex);
+ currentBuffer = (byte[]) file.getBuffer(currentBufferIndex);
bufferPosition = 0;
bufferStart = (long) BUFFER_SIZE * (long) currentBufferIndex;
long buflen = length - bufferStart;
Modified: lucene/java/trunk/src/java/org/apache/lucene/store/RAMOutputStream.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/store/RAMOutputStream.java?rev=598693&r1=598692&r2=598693&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/store/RAMOutputStream.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/store/RAMOutputStream.java Tue Nov 27 09:01:21 2007
@@ -63,7 +63,7 @@
if (nextPos > end) { // at the last buffer
length = (int)(end - pos);
}
- out.writeBytes((byte[])file.buffers.get(buffer++), length);
+ out.writeBytes((byte[])file.getBuffer(buffer++), length);
pos = nextPos;
}
}
@@ -124,10 +124,10 @@
}
private final void switchCurrentBuffer() throws IOException {
- if (currentBufferIndex == file.buffers.size()) {
+ if (currentBufferIndex == file.numBuffers()) {
currentBuffer = file.addBuffer(BUFFER_SIZE);
} else {
- currentBuffer = (byte[]) file.buffers.get(currentBufferIndex);
+ currentBuffer = (byte[]) file.getBuffer(currentBufferIndex);
}
bufferPosition = 0;
bufferStart = (long) BUFFER_SIZE * (long) currentBufferIndex;