[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