diff options
3 files changed, 42 insertions, 41 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/DeltaBaseCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/DeltaBaseCache.java index 8b548242b3..0b2393435a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/DeltaBaseCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/DeltaBaseCache.java @@ -54,35 +54,36 @@ class DeltaBaseCache { return (((int) position) << 22) >>> 22; } - private static int maxByteCount; + private static volatile int defaultMaxByteCount; - private static final Slot[] cache; + private final int maxByteCount; - private static Slot lruHead; + private final Slot[] cache; - private static Slot lruTail; + private Slot lruHead; - private static int openByteCount; + private Slot lruTail; + + private int openByteCount; static { DEAD = new SoftReference<Entry>(null); - maxByteCount = new WindowCacheConfig().getDeltaBaseCacheLimit(); + reconfigure(new WindowCacheConfig()); + } - cache = new Slot[CACHE_SZ]; - for (int i = 0; i < CACHE_SZ; i++) - cache[i] = new Slot(); + static void reconfigure(WindowCacheConfig cfg) { + defaultMaxByteCount = cfg.getDeltaBaseCacheLimit(); } - static synchronized void reconfigure(final WindowCacheConfig cfg) { - final int dbLimit = cfg.getDeltaBaseCacheLimit(); - if (maxByteCount != dbLimit) { - maxByteCount = dbLimit; - releaseMemory(); - } + DeltaBaseCache() { + maxByteCount = defaultMaxByteCount; + cache = new Slot[CACHE_SZ]; } - static synchronized Entry get(final PackFile pack, final long position) { - final Slot e = cache[hash(position)]; + Entry get(final PackFile pack, final long position) { + Slot e = cache[hash(position)]; + if (e == null) + return null; if (e.provider == pack && e.position == position) { final Entry buf = e.data.get(); if (buf != null) { @@ -93,13 +94,18 @@ class DeltaBaseCache { return null; } - static synchronized void store(final PackFile pack, final long position, + void store(final PackFile pack, final long position, final byte[] data, final int objectType) { if (data.length > maxByteCount) return; // Too large to cache. - final Slot e = cache[hash(position)]; - clearEntry(e); + Slot e = cache[hash(position)]; + if (e == null) { + e = new Slot(); + cache[hash(position)] = e; + } else { + clearEntry(e); + } openByteCount += data.length; releaseMemory(); @@ -111,7 +117,7 @@ class DeltaBaseCache { moveToHead(e); } - private static void releaseMemory() { + private void releaseMemory() { while (openByteCount > maxByteCount && lruTail != null) { final Slot currOldest = lruTail; final Slot nextOldest = currOldest.lruPrev; @@ -128,16 +134,7 @@ class DeltaBaseCache { } } - static synchronized void purge(final PackFile file) { - for (final Slot e : cache) { - if (e.provider == file) { - clearEntry(e); - unlink(e); - } - } - } - - private static void moveToHead(final Slot e) { + private void moveToHead(final Slot e) { unlink(e); e.lruPrev = null; e.lruNext = lruHead; @@ -148,7 +145,7 @@ class DeltaBaseCache { lruHead = e; } - private static void unlink(final Slot e) { + private void unlink(final Slot e) { final Slot prev = e.lruPrev; final Slot next = e.lruNext; if (prev != null) @@ -157,17 +154,13 @@ class DeltaBaseCache { next.lruPrev = prev; } - private static void clearEntry(final Slot e) { + private void clearEntry(final Slot e) { openByteCount -= e.sz; e.provider = null; e.data = DEAD; e.sz = 0; } - private DeltaBaseCache() { - throw new UnsupportedOperationException(); - } - static class Entry { final byte[] data; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/PackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/PackFile.java index 959bf43342..80a096633f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/PackFile.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/PackFile.java @@ -236,7 +236,6 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> { * Close the resources utilized by this repository */ public void close() { - DeltaBaseCache.purge(this); WindowCache.purge(this); synchronized (this) { loadedIdx = null; @@ -723,7 +722,7 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> { if (sz != delta.deltaSize) break SEARCH; - DeltaBaseCache.Entry e = DeltaBaseCache.get(this, base); + DeltaBaseCache.Entry e = curs.getDeltaBaseCache().get(this, base); if (e != null) { type = e.type; data = e.data; @@ -741,7 +740,7 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> { if (sz != delta.deltaSize) break SEARCH; - DeltaBaseCache.Entry e = DeltaBaseCache.get(this, base); + DeltaBaseCache.Entry e = curs.getDeltaBaseCache().get(this, base); if (e != null) { type = e.type; data = e.data; @@ -769,7 +768,7 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> { if (cached) cached = false; else if (delta.next == null) - DeltaBaseCache.store(this, delta.basePos, data, type); + curs.getDeltaBaseCache().store(this, delta.basePos, data, type); pos = delta.deltaPos; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCursor.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCursor.java index e2dcae82bc..b3b93b70ca 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCursor.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCursor.java @@ -83,12 +83,20 @@ final class WindowCursor extends ObjectReader implements ObjectReuseAsIs { private ByteWindow window; + private DeltaBaseCache baseCache; + final FileObjectDatabase db; WindowCursor(FileObjectDatabase db) { this.db = db; } + DeltaBaseCache getDeltaBaseCache() { + if (baseCache == null) + baseCache = new DeltaBaseCache(); + return baseCache; + } + @Override public ObjectReader newReader() { return new WindowCursor(db); @@ -334,6 +342,7 @@ final class WindowCursor extends ObjectReader implements ObjectReuseAsIs { /** Release the current window cursor. */ public void release() { window = null; + baseCache = null; try { InflaterCache.release(inf); } finally { |