summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/storage/file/DeltaBaseCache.java67
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/storage/file/PackFile.java7
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCursor.java9
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 {