From 2257a52c25a7676a40f2052590325be534b1410e Mon Sep 17 00:00:00 2001 From: Robin Rosenberg Date: Thu, 16 Aug 2007 22:56:55 +0200 Subject: [PATCH] Use direct buffer io instead of memory mapped I/O for index Under Windows files are locked when open so they cannot be removed and the index remains in use as long as the GC hasn't claimed it. We need to replace the index every time we update it. Signed-off-by: Robin Rosenberg --- org.spearce.jgit/src/org/spearce/jgit/lib/GitIndex.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/GitIndex.java b/org.spearce.jgit/src/org/spearce/jgit/lib/GitIndex.java index 00d80d67..a3db37f7 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/lib/GitIndex.java +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/GitIndex.java @@ -12,9 +12,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.nio.ByteOrder; -import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; -import java.nio.channels.FileChannel.MapMode; import java.security.MessageDigest; import java.util.Comparator; import java.util.Date; @@ -100,13 +98,17 @@ public class GitIndex { statDirty = false; cache = new RandomAccessFile(cacheFile, "r"); try { - MappedByteBuffer map = cache.getChannel().map(MapMode.READ_ONLY, 0, - cacheFile.length()); - map.order(ByteOrder.BIG_ENDIAN); - header = new Header(map); + FileChannel channel = cache.getChannel(); + ByteBuffer buffer = ByteBuffer.allocateDirect((int) cacheFile.length()); + buffer.order(ByteOrder.BIG_ENDIAN); + int j = channel.read(buffer); + if (j != buffer.capacity()) + throw new IOException("Could not read index in one go, only "+j+" out of "+buffer.capacity()+" read"); + buffer.flip(); + header = new Header(buffer); entries.clear(); for (int i = 0; i < header.entries; ++i) { - Entry entry = new Entry(this, map); + Entry entry = new Entry(this, buffer); entries.put(entry.name, entry); } long t1 = System.currentTimeMillis(); -- 2.11.4.GIT