[Mulgara-svn] r1967 - trunk/src/jar/util/java/org/mulgara/util/io
pag at mulgara.org
pag at mulgara.org
Tue Jul 6 21:48:03 UTC 2010
Author: pag
Date: 2010-07-06 21:48:03 +0000 (Tue, 06 Jul 2010)
New Revision: 1967
Modified:
trunk/src/jar/util/java/org/mulgara/util/io/LBufferedFile.java
trunk/src/jar/util/java/org/mulgara/util/io/LIOBufferedFile.java
trunk/src/jar/util/java/org/mulgara/util/io/LMappedBufferedFile.java
trunk/src/jar/util/java/org/mulgara/util/io/LReadOnlyIOBufferedFile.java
Log:
Added a remap listening service to tell listeners when a remap may occur. Of course, only a mapping implementation will perform a remap. Also fixed an error in the mapping implementation that didn't take into account an empty file
Modified: trunk/src/jar/util/java/org/mulgara/util/io/LBufferedFile.java
===================================================================
--- trunk/src/jar/util/java/org/mulgara/util/io/LBufferedFile.java 2010-07-03 02:16:06 UTC (rev 1966)
+++ trunk/src/jar/util/java/org/mulgara/util/io/LBufferedFile.java 2010-07-06 21:48:03 UTC (rev 1967)
@@ -30,7 +30,7 @@
*/
public abstract class LBufferedFile {
- private final static Logger logger = Logger.getLogger(LBufferedFileTest.class);
+ private final static Logger logger = Logger.getLogger(LBufferedFile.class);
/** The property for the block type. May be "direct" or "javaHeap" */
public static final String MEM_TYPE_PROP = "mulgara.xa.memoryType";
@@ -136,6 +136,13 @@
}
/**
+ * Register a listener that will be called when Remaps occur.
+ * The implementation of this class may not do any remapping.
+ * @param l The listener to register.
+ */
+ public abstract void registerRemapListener(Runnable l);
+
+ /**
* Create a buffered file using a filename.
* @param fileName The name of the file to provide buffered access to.
* @return The readonly buffered file.
Modified: trunk/src/jar/util/java/org/mulgara/util/io/LIOBufferedFile.java
===================================================================
--- trunk/src/jar/util/java/org/mulgara/util/io/LIOBufferedFile.java 2010-07-03 02:16:06 UTC (rev 1966)
+++ trunk/src/jar/util/java/org/mulgara/util/io/LIOBufferedFile.java 2010-07-06 21:48:03 UTC (rev 1967)
@@ -65,6 +65,11 @@
file.seek(offset);
}
+ @Override
+ public void registerRemapListener(Runnable l) {
+ /* no-op */
+ }
+
/**
* A wrapper class for allowing ByteBuffers to be mapped by == instead of their internal method.
*/
@@ -74,4 +79,5 @@
public boolean equals(Object o) { return buffer == ((SystemBuffer)o).buffer; }
public int hashCode() { return System.identityHashCode(buffer); }
}
+
}
Modified: trunk/src/jar/util/java/org/mulgara/util/io/LMappedBufferedFile.java
===================================================================
--- trunk/src/jar/util/java/org/mulgara/util/io/LMappedBufferedFile.java 2010-07-03 02:16:06 UTC (rev 1966)
+++ trunk/src/jar/util/java/org/mulgara/util/io/LMappedBufferedFile.java 2010-07-06 21:48:03 UTC (rev 1967)
@@ -5,6 +5,8 @@
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
+import java.util.ArrayList;
+import java.util.List;
/**
* A memory mapped read-only version of LBufferedFile
@@ -20,6 +22,9 @@
/** The page size to use. */
private static final int PAGE_SIZE;
+
+ /** The objects that want to know when the file gets remapped */
+ private List<Runnable> listeners = new ArrayList<Runnable>();
static {
String pageSizeStr = System.getProperty(PAGE_SIZE_PROP);
@@ -90,6 +95,11 @@
// no-op
}
+ @Override
+ public void registerRemapListener(Runnable l) {
+ listeners.add(l);
+ }
+
/**
* Map the entire file
* @throws IOException If there is an error mapping the file
@@ -107,10 +117,12 @@
int start = 0;
if (buffers != null) {
int topBuffer = buffers.length - 1;
- if (buffers[topBuffer].limit() < PAGE_SIZE) {
+ if (topBuffer == -1 || buffers[topBuffer].limit() == PAGE_SIZE) {
+ // last buffer full
+ topBuffer++;
+ } else {
+ // last buffer is partial
buffers[topBuffer] = null;
- } else {
- topBuffer++;
}
System.arraycopy(buffers, 0, newBuffers, 0, topBuffer);
start = topBuffer;
@@ -124,5 +136,9 @@
if (fullPages < pages) newBuffers[fullPages] = fc.map(FileChannel.MapMode.READ_ONLY, fullPages * PAGE_SIZE, size % PAGE_SIZE);
buffers = newBuffers;
+
+ // tell the listeners that we've remapped
+ for (Runnable listener: listeners) listener.run();
}
+
}
Modified: trunk/src/jar/util/java/org/mulgara/util/io/LReadOnlyIOBufferedFile.java
===================================================================
--- trunk/src/jar/util/java/org/mulgara/util/io/LReadOnlyIOBufferedFile.java 2010-07-03 02:16:06 UTC (rev 1966)
+++ trunk/src/jar/util/java/org/mulgara/util/io/LReadOnlyIOBufferedFile.java 2010-07-06 21:48:03 UTC (rev 1967)
@@ -55,4 +55,9 @@
file.seek(offset);
}
+ @Override
+ public void registerRemapListener(Runnable l) {
+ /* no-op */
+ }
+
}
More information about the Mulgara-svn
mailing list