diff --git a/platform/core-api/src/com/intellij/openapi/progress/ProgressIndicatorProvider.java b/platform/core-api/src/com/intellij/openapi/progress/ProgressIndicatorProvider.java index 867d6628f9ea..d9793d2c3257 100644 --- a/platform/core-api/src/com/intellij/openapi/progress/ProgressIndicatorProvider.java +++ b/platform/core-api/src/com/intellij/openapi/progress/ProgressIndicatorProvider.java @@ -32,7 +32,8 @@ public abstract class ProgressIndicatorProvider { @Nullable public static ProgressIndicator getGlobalProgressIndicator() { - return getInstance().getProgressIndicator(); + ProgressManager instance = ProgressManager.ourInstance; + return instance == null ? null : instance.getProgressIndicator(); } /** use {@link ProgressManager#executeNonCancelableSection(Runnable)} instead */ diff --git a/platform/core-api/src/com/intellij/openapi/progress/ProgressManager.java b/platform/core-api/src/com/intellij/openapi/progress/ProgressManager.java index f0fb91904bea..f95cf09dce53 100644 --- a/platform/core-api/src/com/intellij/openapi/progress/ProgressManager.java +++ b/platform/core-api/src/com/intellij/openapi/progress/ProgressManager.java @@ -29,7 +29,7 @@ import javax.swing.*; import java.util.Set; public abstract class ProgressManager extends ProgressIndicatorProvider { - private static ProgressManager ourInstance = CachedSingletonsRegistry.markCachedField(ProgressManager.class); + static ProgressManager ourInstance = CachedSingletonsRegistry.markCachedField(ProgressManager.class); @NotNull @SuppressWarnings("MethodOverridesStaticMethodOfSuperclass") diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/ServiceManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/ServiceManagerImpl.java index bee24c241f44..0a3122fc03df 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/ServiceManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/ServiceManagerImpl.java @@ -13,6 +13,8 @@ import com.intellij.openapi.components.ex.ComponentManagerEx; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.*; import com.intellij.openapi.extensions.impl.ExtensionComponentAdapter; +import com.intellij.openapi.progress.ProgressIndicatorProvider; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.text.StringUtil; @@ -195,34 +197,39 @@ public class ServiceManagerImpl implements Disposable { return instance; } - ComponentAdapter delegate = getDelegate(); - + String implementation = myDescriptor.getImplementation(); if (LOG.isDebugEnabled() && ApplicationManager.getApplication().isWriteAccessAllowed() && !ApplicationManager.getApplication().isUnitTestMode() && - PersistentStateComponent.class.isAssignableFrom(delegate.getComponentImplementation())) { - LOG.warn(new Throwable("Getting service from write-action leads to possible deadlock. Service implementation " + myDescriptor.getImplementation())); + PersistentStateComponent.class.isAssignableFrom(getDelegate().getComponentImplementation())) { + LOG.warn(new Throwable("Getting service from write-action leads to possible deadlock. Service implementation " + + implementation)); } - // prevent storages from flushing and blocking FS - AccessToken token = HeavyProcessLatch.INSTANCE.processStarted("Creating component '" + myDescriptor.getImplementation() + "'"); - try { - instance = delegate.getComponentInstance(container); - if (instance instanceof Disposable) { - Disposer.register(myComponentManager, (Disposable)instance); + // heavy to prevent storages from flushing and blocking FS + try (AccessToken ignore = HeavyProcessLatch.INSTANCE.processStarted("Creating component '" + implementation + "'")) { + Runnable runnable = () -> myInitializedComponentInstance = createAndInitialize(container); + if (ProgressIndicatorProvider.getGlobalProgressIndicator() != null) { + ProgressManager.getInstance().executeNonCancelableSection(runnable); + } else { + runnable.run(); } - - myComponentManager.initializeComponent(instance, true); - - myInitializedComponentInstance = instance; - return instance; - } - finally { - token.finish(); + return myInitializedComponentInstance; } } } + @NotNull + private Object createAndInitialize(@NotNull PicoContainer container) { + Object instance = getDelegate().getComponentInstance(container); + if (instance instanceof Disposable) { + Disposer.register(myComponentManager, (Disposable)instance); + } + + myComponentManager.initializeComponent(instance, true); + return instance; + } + @NotNull private synchronized ComponentAdapter getDelegate() { if (myDelegate == null) {