From 01a7ba225deda5b955b5eafb3608b4a5cf025657 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 3 Jan 2012 16:11:29 +0100 Subject: [PATCH] fix a deadlock when waiting under write action for the FileStatus class to be loaded by another thread, which attempts to initialize a service in and requires a read action --- .../intellij/peer/impl/PeerFactoryImpl.java | 2 +- .../options/colors/ColorAndFontOptions.java | 2 +- .../colors/FileStatusColorsPageFactory.java | 2 +- .../com/intellij/openapi/vcs/FileStatus.java | 29 +++++++------- .../openapi/vcs/FileStatusFactory.java | 34 ++++++++++------ .../openapi/vcs/impl/FileStatusImpl.java | 0 .../vcs/impl/FileStatusFactoryImpl.java | 39 ------------------- .../src/META-INF/PlatformExtensions.xml | 2 - .../ChangelistConflictFileStatusProvider.java | 6 +-- .../hg4idea/provider/HgChangeProvider.java | 6 +-- .../jetbrains/idea/svn17/SvnFileStatus.java | 6 +-- .../org/jetbrains/idea/svn/SvnFileStatus.java | 6 +-- 12 files changed, 51 insertions(+), 83 deletions(-) rename platform/{platform-impl => platform-api}/src/com/intellij/openapi/vcs/impl/FileStatusImpl.java (100%) delete mode 100644 platform/platform-impl/src/com/intellij/openapi/vcs/impl/FileStatusFactoryImpl.java diff --git a/java/idea-ui/src/com/intellij/peer/impl/PeerFactoryImpl.java b/java/idea-ui/src/com/intellij/peer/impl/PeerFactoryImpl.java index f39213655274..920942160194 100644 --- a/java/idea-ui/src/com/intellij/peer/impl/PeerFactoryImpl.java +++ b/java/idea-ui/src/com/intellij/peer/impl/PeerFactoryImpl.java @@ -75,7 +75,7 @@ public class PeerFactoryImpl extends PeerFactory { private final UIHelper myUIHelper = new MyUIHelper(); public FileStatusFactory getFileStatusFactory() { - return ServiceManager.getService(FileStatusFactory.class); + return FileStatusFactory.getInstance(); } public DialogWrapperPeerFactory getDialogWrapperPeerFactory() { diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java index 9ee900a9a06c..ee82d7eed9da 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/ColorAndFontOptions.java @@ -469,7 +469,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract private static void initFileStatusDescriptors(ArrayList descriptions, MyColorScheme scheme) { - FileStatus[] statuses = FileStatusFactory.SERVICE.getInstance().getAllFileStatuses(); + FileStatus[] statuses = FileStatusFactory.getInstance().getAllFileStatuses(); for (FileStatus fileStatus : statuses) { addEditorSettingDescription(descriptions, diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/FileStatusColorsPageFactory.java b/platform/lang-impl/src/com/intellij/application/options/colors/FileStatusColorsPageFactory.java index ec63cb586995..353c6746e31e 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/FileStatusColorsPageFactory.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/FileStatusColorsPageFactory.java @@ -33,7 +33,7 @@ class FileStatusColorsPageFactory implements ColorAndFontPanelFactory { private static Collection collectFileTypes() { ArrayList result = new ArrayList(); - FileStatus[] statuses = FileStatusFactory.SERVICE.getInstance().getAllFileStatuses(); + FileStatus[] statuses = FileStatusFactory.getInstance().getAllFileStatuses(); for (FileStatus status : statuses) { result.add(status.getText()); diff --git a/platform/platform-api/src/com/intellij/openapi/vcs/FileStatus.java b/platform/platform-api/src/com/intellij/openapi/vcs/FileStatus.java index 399cf4810dbd..5c3c8c5a3a02 100644 --- a/platform/platform-api/src/com/intellij/openapi/vcs/FileStatus.java +++ b/platform/platform-api/src/com/intellij/openapi/vcs/FileStatus.java @@ -15,7 +15,6 @@ */ package com.intellij.openapi.vcs; -import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.editor.colors.ColorKey; import com.intellij.ui.Gray; @@ -32,25 +31,25 @@ public interface FileStatus { Color COLOR_SWITCHED = new Color(8, 151, 143); Color COLOR_UNKNOWN = new Color(153, 51, 0); - FileStatus NOT_CHANGED = ServiceManager.getService(FileStatusFactory.class).createFileStatus("NOT_CHANGED", VcsBundle.message("file.status.name.up.to.date"), COLOR_NOT_CHANGED); - FileStatus DELETED = ServiceManager.getService(FileStatusFactory.class).createFileStatus("DELETED", VcsBundle.message("file.status.name.deleted"), COLOR_MISSING); - FileStatus MODIFIED = ServiceManager.getService(FileStatusFactory.class).createFileStatus("MODIFIED", VcsBundle.message("file.status.name.modified"), COLOR_MODIFIED); - FileStatus ADDED = ServiceManager.getService(FileStatusFactory.class).createFileStatus("ADDED", VcsBundle.message("file.status.name.added"), COLOR_ADDED); - FileStatus MERGE = ServiceManager.getService(FileStatusFactory.class).createFileStatus("MERGED", VcsBundle.message("file.status.name.merged"), COLOR_MERGE); - FileStatus UNKNOWN = ServiceManager.getService(FileStatusFactory.class).createFileStatus("UNKNOWN", VcsBundle.message("file.status.name.unknown"), COLOR_UNKNOWN); - FileStatus IGNORED = ServiceManager.getService(FileStatusFactory.class).createFileStatus("IDEA_FILESTATUS_IGNORED", VcsBundle.message("file.status.name.ignored"), new Color(114, 114, 56)); - FileStatus HIJACKED = ServiceManager.getService(FileStatusFactory.class).createFileStatus("HIJACKED", VcsBundle.message("file.status.name.hijacked"), COLOR_HIJACKED); - FileStatus MERGED_WITH_CONFLICTS = ServiceManager.getService(FileStatusFactory.class) + FileStatus NOT_CHANGED = FileStatusFactory.getInstance().createFileStatus("NOT_CHANGED", VcsBundle.message("file.status.name.up.to.date"), COLOR_NOT_CHANGED); + FileStatus DELETED = FileStatusFactory.getInstance().createFileStatus("DELETED", VcsBundle.message("file.status.name.deleted"), COLOR_MISSING); + FileStatus MODIFIED = FileStatusFactory.getInstance().createFileStatus("MODIFIED", VcsBundle.message("file.status.name.modified"), COLOR_MODIFIED); + FileStatus ADDED = FileStatusFactory.getInstance().createFileStatus("ADDED", VcsBundle.message("file.status.name.added"), COLOR_ADDED); + FileStatus MERGE = FileStatusFactory.getInstance().createFileStatus("MERGED", VcsBundle.message("file.status.name.merged"), COLOR_MERGE); + FileStatus UNKNOWN = FileStatusFactory.getInstance().createFileStatus("UNKNOWN", VcsBundle.message("file.status.name.unknown"), COLOR_UNKNOWN); + FileStatus IGNORED = FileStatusFactory.getInstance().createFileStatus("IDEA_FILESTATUS_IGNORED", VcsBundle.message("file.status.name.ignored"), new Color(114, 114, 56)); + FileStatus HIJACKED = FileStatusFactory.getInstance().createFileStatus("HIJACKED", VcsBundle.message("file.status.name.hijacked"), COLOR_HIJACKED); + FileStatus MERGED_WITH_CONFLICTS = FileStatusFactory.getInstance() .createFileStatus("IDEA_FILESTATUS_MERGED_WITH_CONFLICTS", VcsBundle.message("file.status.name.merged.with.conflicts"), Color.red); - FileStatus MERGED_WITH_BOTH_CONFLICTS = ServiceManager.getService(FileStatusFactory.class) + FileStatus MERGED_WITH_BOTH_CONFLICTS = FileStatusFactory.getInstance() .createFileStatus("IDEA_FILESTATUS_MERGED_WITH_BOTH_CONFLICTS", VcsBundle.message("file.status.name.merged.with.both.conflicts"), Color.red); - FileStatus MERGED_WITH_PROPERTY_CONFLICTS = ServiceManager.getService(FileStatusFactory.class) + FileStatus MERGED_WITH_PROPERTY_CONFLICTS = FileStatusFactory.getInstance() .createFileStatus("IDEA_FILESTATUS_MERGED_WITH_PROPERTY_CONFLICTS", VcsBundle.message("file.status.name.merged.with.property.conflicts"), Color.red); - FileStatus DELETED_FROM_FS = ServiceManager.getService(FileStatusFactory.class) + FileStatus DELETED_FROM_FS = FileStatusFactory.getInstance() .createFileStatus("IDEA_FILESTATUS_DELETED_FROM_FILE_SYSTEM", VcsBundle.message("file.status.name.deleted.from.file.system"), new Color(119, 56, 149)); - FileStatus SWITCHED = ServiceManager.getService(FileStatusFactory.class).createFileStatus("SWITCHED", VcsBundle.message("file.status.name.switched"), COLOR_SWITCHED); - FileStatus OBSOLETE = ServiceManager.getService(FileStatusFactory.class).createFileStatus("OBSOLETE", VcsBundle.message("file.status.name.obsolete"), COLOR_OUT_OF_DATE); + FileStatus SWITCHED = FileStatusFactory.getInstance().createFileStatus("SWITCHED", VcsBundle.message("file.status.name.switched"), COLOR_SWITCHED); + FileStatus OBSOLETE = FileStatusFactory.getInstance().createFileStatus("OBSOLETE", VcsBundle.message("file.status.name.obsolete"), COLOR_OUT_OF_DATE); String getText(); diff --git a/platform/platform-api/src/com/intellij/openapi/vcs/FileStatusFactory.java b/platform/platform-api/src/com/intellij/openapi/vcs/FileStatusFactory.java index 2746b5102aa1..b06dbe981962 100644 --- a/platform/platform-api/src/com/intellij/openapi/vcs/FileStatusFactory.java +++ b/platform/platform-api/src/com/intellij/openapi/vcs/FileStatusFactory.java @@ -15,21 +15,33 @@ */ package com.intellij.openapi.vcs; -import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.editor.colors.ColorKey; +import com.intellij.openapi.vcs.impl.FileStatusImpl; import org.jetbrains.annotations.NonNls; import java.awt.*; +import java.util.ArrayList; +import java.util.List; -public interface FileStatusFactory { - FileStatus createFileStatus(@NonNls String id, String description, Color color); - FileStatus[] getAllFileStatuses(); +public class FileStatusFactory { + private static final FileStatusFactory ourInstance = new FileStatusFactory(); + private final List myStatuses = new ArrayList(); - class SERVICE { - private SERVICE() { - } - - public static FileStatusFactory getInstance() { - return ServiceManager.getService(FileStatusFactory.class); - } + private FileStatusFactory() { } + + public synchronized FileStatus createFileStatus(@NonNls String id, String description, Color color) { + FileStatusImpl result = new FileStatusImpl(id, ColorKey.createColorKey("FILESTATUS_" + id, color), description); + myStatuses.add(result); + return result; + } + + public synchronized FileStatus[] getAllFileStatuses() { + return myStatuses.toArray(new FileStatus[myStatuses.size()]); + } + + public static FileStatusFactory getInstance() { + return ourInstance; + } + } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/openapi/vcs/impl/FileStatusImpl.java b/platform/platform-api/src/com/intellij/openapi/vcs/impl/FileStatusImpl.java similarity index 100% rename from platform/platform-impl/src/com/intellij/openapi/vcs/impl/FileStatusImpl.java rename to platform/platform-api/src/com/intellij/openapi/vcs/impl/FileStatusImpl.java diff --git a/platform/platform-impl/src/com/intellij/openapi/vcs/impl/FileStatusFactoryImpl.java b/platform/platform-impl/src/com/intellij/openapi/vcs/impl/FileStatusFactoryImpl.java deleted file mode 100644 index b38a3283f3fb..000000000000 --- a/platform/platform-impl/src/com/intellij/openapi/vcs/impl/FileStatusFactoryImpl.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.openapi.vcs.impl; - -import com.intellij.openapi.editor.colors.ColorKey; -import com.intellij.openapi.vcs.FileStatus; -import com.intellij.openapi.vcs.FileStatusFactory; - -import java.awt.*; -import java.util.ArrayList; -import java.util.List; - - -public class FileStatusFactoryImpl implements FileStatusFactory { - private final List myStatuses = new ArrayList(); - - public FileStatus createFileStatus(String id, String description, Color color) { - FileStatusImpl result = new FileStatusImpl(id, ColorKey.createColorKey("FILESTATUS_" + id, color), description); - myStatuses.add(result); - return result; - } - - public FileStatus[] getAllFileStatuses() { - return myStatuses.toArray(new FileStatus[myStatuses.size()]); - } -} \ No newline at end of file diff --git a/platform/platform-resources/src/META-INF/PlatformExtensions.xml b/platform/platform-resources/src/META-INF/PlatformExtensions.xml index 475822941e4f..fbdb02b6782a 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensions.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensions.xml @@ -63,8 +63,6 @@ - PROCESSORS = diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn17/SvnFileStatus.java b/plugins/svn4idea/src/org/jetbrains/idea/svn17/SvnFileStatus.java index cefdb816d8e2..c859a25e64a1 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn17/SvnFileStatus.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn17/SvnFileStatus.java @@ -27,15 +27,15 @@ public class SvnFileStatus { } public static final FileStatus EXTERNAL = - FileStatusFactory.SERVICE.getInstance() + FileStatusFactory.getInstance() .createFileStatus("IDEA_SVN_FILESTATUS_EXTERNAL", SvnBundle.message("file.status.external"), new Color(0x72A038)); public static final FileStatus OBSTRUCTED = - FileStatusFactory.SERVICE.getInstance() + FileStatusFactory.getInstance() .createFileStatus("IDEA_SVN_FILESTATUS_OBSTRUCTED", SvnBundle.message("file.status.obstructed"), new Color(0x727238)); public static final FileStatus REPLACED = - FileStatusFactory.SERVICE.getInstance().createFileStatus("IDEA_SVN_REPLACED", + FileStatusFactory.getInstance().createFileStatus("IDEA_SVN_REPLACED", SvnBundle.message("file.status.replaced"), FileStatus.COLOR_ADDED); } diff --git a/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/SvnFileStatus.java b/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/SvnFileStatus.java index e5330ab2650c..f794b29cacb0 100644 --- a/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/SvnFileStatus.java +++ b/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/SvnFileStatus.java @@ -27,15 +27,15 @@ public class SvnFileStatus { } public static final FileStatus EXTERNAL = - FileStatusFactory.SERVICE.getInstance() + FileStatusFactory.getInstance() .createFileStatus("IDEA_SVN_FILESTATUS_EXTERNAL", SvnBundle.message("file.status.external"), new Color(0x72A038)); public static final FileStatus OBSTRUCTED = - FileStatusFactory.SERVICE.getInstance() + FileStatusFactory.getInstance() .createFileStatus("IDEA_SVN_FILESTATUS_OBSTRUCTED", SvnBundle.message("file.status.obstructed"), new Color(0x727238)); public static final FileStatus REPLACED = - FileStatusFactory.SERVICE.getInstance().createFileStatus("IDEA_SVN_REPLACED", + FileStatusFactory.getInstance().createFileStatus("IDEA_SVN_REPLACED", SvnBundle.message("file.status.replaced"), FileStatus.COLOR_ADDED); }