From dba7e9a86aa4c75daebcb598fab5d18322968d66 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 5 Feb 2014 13:52:55 +0100 Subject: [PATCH] lock-free FileBasedIndexImpl.myTransactionMap --- .../util/indexing/FileBasedIndexImpl.java | 24 ++++++------------- .../util/src/com/intellij/util/SmartFMap.java | 6 +++++ 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java index 466ce00f0a7c..290179f90bc7 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java @@ -127,7 +127,7 @@ public class FileBasedIndexImpl extends FileBasedIndex { private final FileDocumentManager myFileDocumentManager; private final FileTypeManager myFileTypeManager; private final ConcurrentHashSet> myUpToDateIndices = new ConcurrentHashSet>(); - private final Map myTransactionMap = new THashMap(); + private volatile SmartFMap myTransactionMap = SmartFMap.emptyMap(); @Nullable private final String myConfigPath; @Nullable private final String myLogPath; @@ -157,18 +157,14 @@ public class FileBasedIndexImpl extends FileBasedIndex { @Override public void transactionStarted(final Document doc, final PsiFile file) { if (file != null) { - synchronized (myTransactionMap) { - myTransactionMap.put(doc, file); - } + myTransactionMap = myTransactionMap.plus(doc, file); myUpToDateIndices.clear(); } } @Override public void transactionCompleted(final Document doc, final PsiFile file) { - synchronized (myTransactionMap) { - myTransactionMap.remove(doc); - } + myTransactionMap = myTransactionMap.minus(doc); } }); @@ -1403,9 +1399,7 @@ public class FileBasedIndexImpl extends FileBasedIndex { @NotNull private Set getTransactedDocuments() { - synchronized (myTransactionMap) { - return new THashSet(myTransactionMap.keySet()); - } + return myTransactionMap.keySet(); } private void indexUnsavedDocuments(@NotNull ID indexId, @@ -1461,9 +1455,7 @@ public class FileBasedIndexImpl extends FileBasedIndex { } private boolean hasActiveTransactions() { - synchronized (myTransactionMap) { - return !myTransactionMap.isEmpty(); - } + return !myTransactionMap.isEmpty(); } private interface DocumentContent { @@ -1588,10 +1580,8 @@ public class FileBasedIndexImpl extends FileBasedIndex { @Nullable private PsiFile findDominantPsiForDocument(@NotNull Document document, @Nullable Project project) { - synchronized (myTransactionMap) { - PsiFile psiFile = myTransactionMap.get(document); - if (psiFile != null) return psiFile; - } + PsiFile psiFile = myTransactionMap.get(document); + if (psiFile != null) return psiFile; return project == null ? null : findLatestKnownPsiForUncomittedDocument(document, project); } diff --git a/platform/util/src/com/intellij/util/SmartFMap.java b/platform/util/src/com/intellij/util/SmartFMap.java index f34144223541..a4b95a189bb5 100644 --- a/platform/util/src/com/intellij/util/SmartFMap.java +++ b/platform/util/src/com/intellij/util/SmartFMap.java @@ -203,6 +203,8 @@ public class SmartFMap implements Map { @NotNull @Override public Set keySet() { + if (isEmpty()) return Collections.emptySet(); + LinkedHashSet result = new LinkedHashSet(); for (Entry entry : entrySet()) { result.add(entry.getKey()); @@ -213,6 +215,8 @@ public class SmartFMap implements Map { @NotNull @Override public Collection values() { + if (isEmpty()) return Collections.emptyList(); + ArrayList result = new ArrayList(); for (Entry entry : entrySet()) { result.add(entry.getValue()); @@ -242,6 +246,8 @@ public class SmartFMap implements Map { @NotNull @Override public Set> entrySet() { + if (isEmpty()) return Collections.emptySet(); + LinkedHashSet> set = new LinkedHashSet>(); if (myMap instanceof Map) { for (Entry entry : ((Map)myMap).entrySet()) {