From 76da0a1b6db1eafea00f63568baf53f5be51b582 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Wed, 18 Feb 2015 15:03:20 +0300 Subject: [PATCH] fixed deadlock --- .../impl/FileEditorManagerImpl.java | 47 ++++++++++++------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java index 5409d69a30d0..9cfd4f89bccd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileEditorManagerImpl.java @@ -152,28 +152,39 @@ public class FileEditorManagerImpl extends FileEditorManagerEx implements Projec } public void exitDumbMode() { - VirtualFile[] files = getOpenFiles(); - for (VirtualFile file : files) { - Set providers = new HashSet(); - List composites = getEditorComposites(file); - for (EditorWithProviderComposite composite : composites) { - providers.addAll(Arrays.asList(composite.getProviders())); + // can happen under write action, so postpone to avoid deadlock on FileEditorProviderManager.getProviders() + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + if (!project.isDisposed()) + dumbModeFinished(project); } - FileEditorProvider[] newProviders = FileEditorProviderManager.getInstance().getProviders(project, file); - if (newProviders.length > providers.size()) { - List toOpen = new ArrayList(Arrays.asList(newProviders)); - toOpen.removeAll(providers); - // need to open additional non dumb-aware editors - for (EditorWithProviderComposite composite : composites) { - for (FileEditorProvider provider : toOpen) { - FileEditor editor = provider.createEditor(myProject, file); - composite.addEditor(editor, provider); - } - } + }); + } + }); + } + + private void dumbModeFinished(Project project) { + VirtualFile[] files = getOpenFiles(); + for (VirtualFile file : files) { + Set providers = new HashSet(); + List composites = getEditorComposites(file); + for (EditorWithProviderComposite composite : composites) { + providers.addAll(Arrays.asList(composite.getProviders())); + } + FileEditorProvider[] newProviders = FileEditorProviderManager.getInstance().getProviders(project, file); + if (newProviders.length > providers.size()) { + List toOpen = new ArrayList(Arrays.asList(newProviders)); + toOpen.removeAll(providers); + // need to open additional non dumb-aware editors + for (EditorWithProviderComposite composite : composites) { + for (FileEditorProvider provider : toOpen) { + FileEditor editor = provider.createEditor(myProject, file); + composite.addEditor(editor, provider); } } } - }); + } } public void initDockableContentFactory() {