diff --git a/java/compiler/impl/src/com/intellij/compiler/make/BackwardDependenciesStorage.java b/java/compiler/impl/src/com/intellij/compiler/make/BackwardDependenciesStorage.java index e551d81be091..f5063ec125e7 100644 --- a/java/compiler/impl/src/com/intellij/compiler/make/BackwardDependenciesStorage.java +++ b/java/compiler/impl/src/com/intellij/compiler/make/BackwardDependenciesStorage.java @@ -112,19 +112,19 @@ public class BackwardDependenciesStorage implements Flushable, Disposable { } } - public void addClassReferencer(Integer qName, int referencerQName) { + public synchronized void addClassReferencer(Integer qName, int referencerQName) { myCache.get(qName).addReferencer(new ReferencerItem(referencerQName)); } - public void addFieldReferencer(Integer qName, int referencerQName, int fieldName) { + public synchronized void addFieldReferencer(Integer qName, int referencerQName, int fieldName) { myCache.get(qName).addReferencer(new FieldReferencerItem(referencerQName, fieldName)); } - public void addMethodReferencer(Integer qName, int referencerQName, int methodName, int descriptor) { + public synchronized void addMethodReferencer(Integer qName, int referencerQName, int methodName, int descriptor) { myCache.get(qName).addReferencer(new MethodReferencerItem(referencerQName, methodName, descriptor)); } - public Dependency[] getDependencies(Integer classQName) throws CacheCorruptedException { + public synchronized Dependency[] getDependencies(Integer classQName) throws CacheCorruptedException { try { if (!myMap.containsMapping(classQName)) { return Dependency.EMPTY_ARRAY; diff --git a/java/compiler/impl/src/com/intellij/compiler/make/DependencyCache.java b/java/compiler/impl/src/com/intellij/compiler/make/DependencyCache.java index 05fd42531799..7cc150d13ff3 100644 --- a/java/compiler/impl/src/com/intellij/compiler/make/DependencyCache.java +++ b/java/compiler/impl/src/com/intellij/compiler/make/DependencyCache.java @@ -46,22 +46,23 @@ import java.util.*; public class DependencyCache { private static final Logger LOG = Logger.getInstance("#com.intellij.compiler.make.DependencyCache"); - private Cache myCache; - private Cache myNewClassesCache; + private volatile Cache myCache; + private volatile Cache myNewClassesCache; private static final String REMOTE_INTERFACE_NAME = Remote.class.getName(); - private TIntHashSet myToUpdate = new TIntHashSet(); // qName strings to be updated. + private final TIntHashSet myToUpdate = new TIntHashSet(); // qName strings to be updated. private final TIntHashSet myTraverseRoots = new TIntHashSet(); // Dependencies are calculated from these clasess private final TIntHashSet myClassesWithSourceRemoved = new TIntHashSet(); private final TIntHashSet myPreviouslyRemoteClasses = new TIntHashSet(); // classes that were Remote, but became non-Remote for some reason private final TIntHashSet myMarkedInfos = new TIntHashSet(); // classes to be recompiled private final Set myMarkedFiles = new HashSet(); - private DependencyCacheNavigator myCacheNavigator; - private SymbolTable mySymbolTable; + private volatile DependencyCacheNavigator myCacheNavigator; + private volatile SymbolTable mySymbolTable; private final String mySymbolTableFilePath; private final String myStoreDirectoryPath; - @NonNls private static final String SYMBOLTABLE_FILE_NAME = "symboltable.dat"; + @NonNls + private static final String SYMBOLTABLE_FILE_NAME = "symboltable.dat"; public DependencyCache(@NonNls String storeDirectoryPath) { myStoreDirectoryPath = storeDirectoryPath; @@ -225,7 +226,7 @@ public class DependencyCache { for (final int qName : myClassesWithSourceRemoved.toArray()) { cache.removeClass(qName); } - myToUpdate = new TIntHashSet(); + myToUpdate.clear(); //pause(); }