From b69e6c1a49ed078214d94a0e73ebca14dfc3862a Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Mon, 28 Nov 2016 23:16:23 +0300 Subject: [PATCH] make project map concurrent --- .../vfs/ex/dummy/DummyCachingFileSystem.java | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyCachingFileSystem.java b/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyCachingFileSystem.java index b6552220e2f7..c388b7a7794a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyCachingFileSystem.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyCachingFileSystem.java @@ -25,7 +25,6 @@ import com.intellij.openapi.project.ProjectManagerAdapter; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.containers.BidirectionalMap; import com.intellij.util.containers.ConcurrentFactoryMap; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.FactoryMap; @@ -35,17 +34,17 @@ import org.jetbrains.annotations.TestOnly; import java.io.IOException; import java.util.Collection; -import java.util.List; +import java.util.concurrent.ConcurrentMap; /** * @author gregsh */ public abstract class DummyCachingFileSystem extends DummyFileSystem { - private static final Logger LOG = Logger.getInstance("com.intellij.openapi.vfs.ex.dummy.DummyCachingFileSystem"); + private static final Logger LOG = Logger.getInstance(DummyCachingFileSystem.class); private final String myProtocol; - private final BidirectionalMap myProject2Id = new BidirectionalMap<>(); + private final ConcurrentMap myProjectMap = ContainerUtil.newConcurrentMap(); private final FactoryMap myCachedFiles = new ConcurrentFactoryMap() { @Override @@ -117,21 +116,18 @@ public abstract class DummyCachingFileSystem extends Dumm } @Nullable - public Project getProject(String projectId) { - List list = myProject2Id.getKeysByValue(projectId); - return list == null || list.size() > 1 ? null : list.get(0); + public Project getProject(@Nullable String projectId) { + return myProjectMap.get(projectId); } @NotNull public Project getProjectOrFail(String projectId) { - List list = myProject2Id.getKeysByValue(projectId); - if (list == null || list.isEmpty()) { - throw new AssertionError(projectId + " project not found among: " + ContainerUtil.newArrayList(myProject2Id.values())); + Project project = myProjectMap.get(projectId); + if (project == null) { + throw new AssertionError(String.format("'%s' project not found among %s", projectId, + ContainerUtil.newArrayList(myProjectMap.keySet()))); } - if (list.size() != 1) { - throw new AssertionError(projectId + " is mapped to several projects: " + list); - } - return list.get(0); + return project; } @NotNull @@ -139,8 +135,17 @@ public abstract class DummyCachingFileSystem extends Dumm return myCachedFiles.notNullValues(); } - public void onProjectClosed(Project project) { - myProject2Id.remove(project); + @TestOnly + public void onProjectClosed(@NotNull Project project) { + onProjectClosedInner(project); + } + + protected void onProjectClosedInner(@NotNull Project project) { + String projectId = project.getLocationHash(); + Project mapped = myProjectMap.remove(projectId); + if (mapped == null) { + LOG.warn(String.format("'%s' project not mapped", projectId)); + } clearCache(); } @@ -150,17 +155,16 @@ public abstract class DummyCachingFileSystem extends Dumm Disposer.register(project, new Disposable() { @Override public void dispose() { - onProjectClosed(project); + onProjectClosedInner(project); } }); clearCache(); String projectId = project.getLocationHash(); - myProject2Id.put(project, projectId); + Project mapped = myProjectMap.put(projectId, project); - List projects = myProject2Id.getKeysByValue(projectId); - if (projects != null && projects.size() > 1) { - LOG.error("project " + projectId + " already registered: " + projects); + if (mapped != null) { + LOG.error(String.format("'%s' project rebound, was %s", projectId, mapped)); } } @@ -185,7 +189,7 @@ public abstract class DummyCachingFileSystem extends Dumm @TestOnly public void cleanup() { myCachedFiles.clear(); - myProject2Id.clear(); + myProjectMap.clear(); } @Override -- 2.32.0