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 <clinit> and requires a read action

This commit is contained in:
peter
2012-01-03 18:00:47 +01:00
parent 0600045583
commit 01a7ba225d
12 changed files with 51 additions and 83 deletions
@@ -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() {
@@ -469,7 +469,7 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract
private static void initFileStatusDescriptors(ArrayList<EditorSchemeAttributeDescriptor> descriptions, MyColorScheme scheme) {
FileStatus[] statuses = FileStatusFactory.SERVICE.getInstance().getAllFileStatuses();
FileStatus[] statuses = FileStatusFactory.getInstance().getAllFileStatuses();
for (FileStatus fileStatus : statuses) {
addEditorSettingDescription(descriptions,
@@ -33,7 +33,7 @@ class FileStatusColorsPageFactory implements ColorAndFontPanelFactory {
private static Collection<String> collectFileTypes() {
ArrayList<String> result = new ArrayList<String>();
FileStatus[] statuses = FileStatusFactory.SERVICE.getInstance().getAllFileStatuses();
FileStatus[] statuses = FileStatusFactory.getInstance().getAllFileStatuses();
for (FileStatus status : statuses) {
result.add(status.getText());
@@ -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();
@@ -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<FileStatus> myStatuses = new ArrayList<FileStatus>();
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;
}
}
@@ -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<FileStatus> myStatuses = new ArrayList<FileStatus>();
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()]);
}
}
@@ -63,8 +63,6 @@
<applicationService serviceInterface="com.intellij.openapi.ui.DialogWrapperPeerFactory"
serviceImplementation="com.intellij.openapi.ui.impl.DialogWrapperPeerFactoryImpl"/>
<applicationService serviceInterface="com.intellij.openapi.vcs.FileStatusFactory"
serviceImplementation="com.intellij.openapi.vcs.impl.FileStatusFactoryImpl"/>
<applicationService serviceInterface="com.intellij.ui.content.ContentFactory"
serviceImplementation="com.intellij.ui.content.ContentFactoryImpl"/>
<applicationService serviceInterface="com.intellij.ui.TreeUIHelper"
@@ -33,11 +33,11 @@ import java.awt.*;
public class ChangelistConflictFileStatusProvider implements FileStatusProvider {
private static final FileStatus MODIFIED_OUTSIDE =
FileStatusFactory.SERVICE.getInstance().createFileStatus("modifiedOutside", "Modified in not active changelist", FileStatus.COLOR_MODIFIED.brighter());
FileStatusFactory.getInstance().createFileStatus("modifiedOutside", "Modified in not active changelist", FileStatus.COLOR_MODIFIED.brighter());
private static final FileStatus ADDED_OUTSIDE =
FileStatusFactory.SERVICE.getInstance().createFileStatus("addedOutside", "Added in not active changelist", FileStatus.COLOR_ADDED.brighter());
FileStatusFactory.getInstance().createFileStatus("addedOutside", "Added in not active changelist", FileStatus.COLOR_ADDED.brighter());
private static final FileStatus CHANGELIST_CONFLICT =
FileStatusFactory.SERVICE.getInstance().createFileStatus("changelistConflict", "Changelist conflict", Color.red);
FileStatusFactory.getInstance().createFileStatus("changelistConflict", "Changelist conflict", Color.red);
private final ChangelistConflictTracker myConflictTracker;
private final ChangeListManager myChangeListManager;
@@ -12,7 +12,6 @@
// limitations under the License.
package org.zmlx.hg4idea.provider;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.project.Project;
@@ -37,9 +36,8 @@ public class HgChangeProvider implements ChangeProvider {
private final Project myProject;
private final VcsKey myVcsKey;
public static final FileStatus COPIED =
ServiceManager.getService(FileStatusFactory.class).createFileStatus("COPIED", "Copied", FileStatus.COLOR_ADDED);
public static final FileStatus RENAMED = ServiceManager.getService(FileStatusFactory.class).createFileStatus("RENAMED", "Renamed",
public static final FileStatus COPIED = FileStatusFactory.getInstance().createFileStatus("COPIED", "Copied", FileStatus.COLOR_ADDED);
public static final FileStatus RENAMED = FileStatusFactory.getInstance().createFileStatus("RENAMED", "Renamed",
Color.cyan.darker().darker());
private static final EnumMap<HgFileStatusEnum, HgChangeProcessor> PROCESSORS =
@@ -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);
}
@@ -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);
}