summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit
diff options
context:
space:
mode:
authorPhilipp Marx <smigfu@googlemail.com>2016-11-12 11:11:19 +0100
committerPhilipp Marx <smigfu@googlemail.com>2016-11-12 11:11:19 +0100
commitdf6f2d68607accc290b10b68c83abb26f8c9c8ab (patch)
treee35cda6a87f93f5cac5d4c0e606f5a531a03366f /org.eclipse.jgit
parent8adbfe4da6723768febbb86c22ac118e233c2154 (diff)
downloadjgit-df6f2d68607accc290b10b68c83abb26f8c9c8ab.tar.gz
jgit-df6f2d68607accc290b10b68c83abb26f8c9c8ab.zip
Reduce synchronized scope around ConcurrentHashMap
Change-Id: I982a78070efb6bc2d3395330456d62e0d5ce6da7 Signed-off-by: Philipp Marx <smigfu@googlemail.com>
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java30
1 files changed, 15 insertions, 15 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java
index 05627ed86b..f7decf1324 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java
@@ -263,20 +263,22 @@ public final class DfsBlockCache {
// TODO This table grows without bound. It needs to clean up
// entries that aren't in cache anymore, and aren't being used
// by a live DfsObjDatabase reference.
- synchronized (packCache) {
- DfsPackFile pack = packCache.get(dsc);
- if (pack != null && pack.invalid()) {
- packCache.remove(dsc);
- pack = null;
- }
- if (pack == null) {
- if (key == null)
- key = new DfsPackKey();
- pack = new DfsPackFile(this, dsc, key);
- packCache.put(dsc, pack);
- }
+
+ DfsPackFile pack = packCache.get(dsc);
+ if (pack != null && !pack.invalid()) {
return pack;
}
+
+ // 'pack' either didn't exist or was invalid. Compute a new
+ // entry atomically (guaranteed by ConcurrentHashMap).
+ return packCache.compute(dsc, (k, v) -> {
+ if (v != null && !v.invalid()) { // valid value added by
+ return v; // another thread
+ } else {
+ return new DfsPackFile(
+ this, dsc, key != null ? key : new DfsPackKey());
+ }
+ });
}
private int hash(int packHash, long off) {
@@ -504,9 +506,7 @@ public final class DfsBlockCache {
}
void remove(DfsPackFile pack) {
- synchronized (packCache) {
- packCache.remove(pack.getPackDescription());
- }
+ packCache.remove(pack.getPackDescription());
}
private int slot(DfsPackKey pack, long position) {