diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsBlockCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsBlockCache.java index 3ae9690d7..871a2c503 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsBlockCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsBlockCache.java @@ -46,9 +46,11 @@ package org.eclipse.jgit.storage.dfs; import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReferenceArray; @@ -156,6 +158,9 @@ public final class DfsBlockCache { /** Cache of pack files, indexed by description. */ private final Map packCache; + /** View of pack files in the pack cache. */ + private final Collection packFiles; + /** Number of times a block was found in the cache. */ private final AtomicLong statHit; @@ -203,7 +208,9 @@ public final class DfsBlockCache { readAheadLimit = cfg.getReadAheadLimit(); readAheadService = cfg.getReadAheadService(); - packCache = new HashMap(); + packCache = new ConcurrentHashMap( + 16, 0.75f, 1); + packFiles = Collections.unmodifiableCollection(packCache.values()); statHit = new AtomicLong(); statMiss = new AtomicLong(); @@ -234,6 +241,16 @@ public final class DfsBlockCache { return statEvict; } + /** + * Get the pack files stored in this cache. + * + * @return a collection of pack files, some of which may not actually be + * present; the caller should check the pack's cached size. + */ + public Collection getPackFiles() { + return packFiles; + } + DfsPackFile getOrCreate(DfsPackDescription dsc, DfsPackKey key) { // TODO This table grows without bound. It needs to clean up // entries that aren't in cache anymore, and aren't being used