Contention on getInstance() for quite a few services relaxed.

This commit is contained in:
Maxim Shafirov
2009-11-04 22:47:50 +03:00
parent be003f732f
commit 35846cc462
9 changed files with 31 additions and 42 deletions
@@ -30,7 +30,6 @@ import com.intellij.openapi.util.NotNullLazyKey;
import com.intellij.psi.PsiElement;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.util.ConcurrencyUtil;
import com.intellij.util.NotNullFunction;
import com.intellij.util.containers.ConcurrentWeakHashMap;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -44,12 +43,7 @@ public class ControlFlowFactory {
// psiElements hold weakly, controlFlows softly
private final ConcurrentMap<PsiElement, Reference<CopyOnWriteArrayList<ControlFlowContext>>> cachedFlows = new ConcurrentWeakHashMap<PsiElement, Reference<CopyOnWriteArrayList<ControlFlowContext>>>();
private static final NotNullLazyKey<ControlFlowFactory, Project> INSTANCE_KEY = NotNullLazyKey.create("ControlFlowFactory.Instance.Cache", new NotNullFunction<Project, ControlFlowFactory>() {
@NotNull
public ControlFlowFactory fun(final Project project) {
return ServiceManager.getService(project, ControlFlowFactory.class);
}
});
private static final NotNullLazyKey<ControlFlowFactory, Project> INSTANCE_KEY = ServiceManager.createLazyKey(ControlFlowFactory.class);
public static ControlFlowFactory getInstance(Project project) {
return INSTANCE_KEY.getValue(project);
@@ -31,7 +31,6 @@ import com.intellij.psi.PsiVariable;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.util.ConcurrencyUtil;
import com.intellij.util.Function;
import com.intellij.util.NotNullFunction;
import com.intellij.util.containers.ConcurrentWeakHashMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -44,12 +43,7 @@ import java.util.concurrent.ConcurrentMap;
public class JavaResolveCache {
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.resolve.JavaResolveCache");
private static final NotNullLazyKey<JavaResolveCache, Project> INSTANCE_KEY = NotNullLazyKey.create("JavaResolveCache.Instance.Cache", new NotNullFunction<Project, JavaResolveCache>() {
@NotNull
public JavaResolveCache fun(final Project project) {
return ServiceManager.getService(project, JavaResolveCache.class);
}
});
private static final NotNullLazyKey<JavaResolveCache, Project> INSTANCE_KEY = ServiceManager.createLazyKey(JavaResolveCache.class);
public static JavaResolveCache getInstance(Project project) {
return INSTANCE_KEY.getValue(project);
@@ -27,9 +27,7 @@ import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiModifierListOwner;
import com.intellij.util.NotNullFunction;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public abstract class ExternalAnnotationsManager {
@@ -41,12 +39,7 @@ public abstract class ExternalAnnotationsManager {
NOWHERE
}
private static final NotNullLazyKey<ExternalAnnotationsManager, Project> INSTANCE_KEY = NotNullLazyKey.create("ExternalAnnotationsManager.Instance.Cache", new NotNullFunction<Project, ExternalAnnotationsManager>() {
@NotNull
public ExternalAnnotationsManager fun(final Project project) {
return ServiceManager.getService(project, ExternalAnnotationsManager.class);
}
});
private static final NotNullLazyKey<ExternalAnnotationsManager, Project> INSTANCE_KEY = ServiceManager.createLazyKey(ExternalAnnotationsManager.class);
public static ExternalAnnotationsManager getInstance(Project project) {
return INSTANCE_KEY.getValue(project);
@@ -25,18 +25,12 @@ import com.intellij.openapi.util.NotNullLazyKey;
import com.intellij.psi.javadoc.JavadocManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.PsiShortNamesCache;
import com.intellij.util.NotNullFunction;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public abstract class JavaPsiFacade {
private static final NotNullLazyKey<JavaPsiFacade, Project> INSTANCE_KEY = NotNullLazyKey.create("JavaPsiFacade.Instance.Cache", new NotNullFunction<Project, JavaPsiFacade>() {
@NotNull
public JavaPsiFacade fun(final Project project) {
return ServiceManager.getService(project, JavaPsiFacade.class);
}
});
private static final NotNullLazyKey<JavaPsiFacade, Project> INSTANCE_KEY = ServiceManager.createLazyKey(JavaPsiFacade.class);
public static JavaPsiFacade getInstance(Project project) {
return INSTANCE_KEY.getValue(project);
@@ -199,4 +193,4 @@ public abstract class JavaPsiFacade {
public abstract boolean arePackagesTheSame(@NotNull PsiElement element1, @NotNull PsiElement element2);
public abstract Project getProject();
}
}
@@ -21,6 +21,7 @@ import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.NotNullLazyKey;
import com.intellij.openapi.util.Trinity;
import com.intellij.patterns.*;
import com.intellij.pom.references.PomReferenceProvider;
@@ -58,8 +59,10 @@ public class ReferenceProvidersRegistry extends PsiReferenceRegistrar {
};
private final Project myProject;
public static ReferenceProvidersRegistry getInstance(@NotNull Project project) {
return ServiceManager.getService(project, ReferenceProvidersRegistry.class);
private final static NotNullLazyKey<ReferenceProvidersRegistry, Project> INSTANCE_CACHE = ServiceManager.createLazyKey(ReferenceProvidersRegistry.class);
public static ReferenceProvidersRegistry getInstance(Project project) {
return INSTANCE_CACHE.getValue(project);
}
public ReferenceProvidersRegistry(Project project) {
@@ -18,6 +18,9 @@ package com.intellij.openapi.components;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.NotNullLazyKey;
import com.intellij.util.NotNullFunction;
import org.jetbrains.annotations.NotNull;
/**
@@ -36,5 +39,13 @@ public class ServiceManager {
public static <T> T getService(Project project, Class<T> serviceClass) {
return (T)project.getPicoContainer().getComponentInstance(serviceClass.getName());
}
public static <T> NotNullLazyKey<T, Project> createLazyKey(final Class<T> serviceClass) {
return NotNullLazyKey.create("Service: " + serviceClass.getName(), new NotNullFunction<Project, T>() {
@NotNull
public T fun(Project project) {
return getService(project, serviceClass);
}
});
}
}
@@ -22,7 +22,6 @@ import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.ui.popup.BalloonHandler;
import com.intellij.openapi.util.NotNullLazyKey;
import com.intellij.util.NotNullFunction;
import com.intellij.util.concurrency.Semaphore;
import com.intellij.util.messages.Topic;
import org.jetbrains.annotations.NotNull;
@@ -95,12 +94,7 @@ public abstract class DumbService {
}, modalityState);
}
private static final NotNullLazyKey<DumbService, Project> INSTANCE_KEY = NotNullLazyKey.create("DumbService.Cache", new NotNullFunction<Project, DumbService>() {
@NotNull
public DumbService fun(final Project project) {
return ServiceManager.getService(project, DumbService.class);
}
});
private static final NotNullLazyKey<DumbService, Project> INSTANCE_KEY = ServiceManager.createLazyKey(DumbService.class);
public static DumbService getInstance(@NotNull Project project) {
return INSTANCE_KEY.getValue(project);
@@ -22,6 +22,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Factory;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.ModificationTracker;
import com.intellij.openapi.util.NotNullLazyKey;
import com.intellij.psi.PsiReferenceFactory;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlFile;
@@ -40,8 +41,10 @@ import java.lang.reflect.Type;
public abstract class DomManager implements ModificationTracker {
public static final Key<Module> MOCK_ELEMENT_MODULE = Key.create("MockElementModule");
private final static NotNullLazyKey<DomManager, Project> INSTANCE_CACHE = ServiceManager.createLazyKey(DomManager.class);
public static DomManager getDomManager(Project project) {
return ServiceManager.getService(project, DomManager.class);
return INSTANCE_CACHE.getValue(project);
}
public abstract Project getProject();
@@ -381,8 +381,11 @@ public class ExternalResourceManagerImpl extends ExternalResourceManagerEx imple
}
}
private final static NotNullLazyKey<ProjectResources, Project> INSTANCE_CACHE = ServiceManager.createLazyKey(ProjectResources.class);
private static ExternalResourceManagerImpl getProjectResources(Project project) {
return ServiceManager.getService(project, ProjectResources.class);
return INSTANCE_CACHE.getValue(project);
}
}