diff --git a/platform/core-api/src/com/intellij/psi/tree/IElementType.java b/platform/core-api/src/com/intellij/psi/tree/IElementType.java index 29a5a8509404..fb12d752f16b 100644 --- a/platform/core-api/src/com/intellij/psi/tree/IElementType.java +++ b/platform/core-api/src/com/intellij/psi/tree/IElementType.java @@ -1,7 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.psi.tree; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.lang.Language; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.text.StringUtil; @@ -88,7 +88,7 @@ public class IElementType { this(debugName, language, true); if (!(this instanceof IFileElementType)) { - LoadingPhase.COMPONENT_LOADED.assertAtLeast(); + LoadingState.COMPONENTS_LOADED.checkOccurred(); } } diff --git a/platform/core-impl/src/com/intellij/diagnostic/PerformanceWatcher.java b/platform/core-impl/src/com/intellij/diagnostic/PerformanceWatcher.java index e0391cc6f35a..5c0d8d15b5d4 100644 --- a/platform/core-impl/src/com/intellij/diagnostic/PerformanceWatcher.java +++ b/platform/core-impl/src/com/intellij/diagnostic/PerformanceWatcher.java @@ -68,7 +68,7 @@ public final class PerformanceWatcher implements Disposable { @NotNull public static PerformanceWatcher getInstance() { - LoadingPhase.CONFIGURATION_STORE_INITIALIZED.assertAtLeast(); + LoadingState.CONFIGURATION_STORE_INITIALIZED.checkOccurred(); return ServiceManager.getService(PerformanceWatcher.class); } @@ -229,7 +229,7 @@ public final class PerformanceWatcher implements Disposable { myLastDumpTime = currentMillis; if (myFreezeStart == 0) { myFreezeStart = myLastEdtAlive; - myFreezeDuringStartup = !LoadingPhase.isStartupComplete(); + myFreezeDuringStartup = !LoadingState.INDEXING_FINISHED.isOccurred(); getPublisher().uiFreezeStarted(); } dumpThreads(); diff --git a/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java b/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java index f87d06061295..5d493b1ee95f 100644 --- a/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/application/TransactionGuardImpl.java @@ -2,7 +2,7 @@ package com.intellij.openapi.application; import com.google.common.base.MoreObjects; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.diagnostic.StartUpMeasurer; import com.intellij.ide.plugins.PluginManagerCore; import com.intellij.ide.plugins.cl.PluginClassLoader; @@ -251,7 +251,7 @@ public class TransactionGuardImpl extends TransactionGuard { } private static boolean areAssertionsEnabled() { - return LoadingPhase.COMPONENT_LOADED.isComplete() && Registry.is("ide.require.transaction.for.model.changes", false); + return LoadingState.COMPONENTS_LOADED.isOccurred() && Registry.is("ide.require.transaction.for.model.changes", false); } @Override diff --git a/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.kt b/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.kt index 202392e657b6..6f22f8203f54 100644 --- a/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.kt +++ b/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.kt @@ -1,7 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.ui -import com.intellij.diagnostic.LoadingPhase +import com.intellij.diagnostic.LoadingState import com.intellij.openapi.Disposable import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.components.PersistentStateComponent @@ -419,7 +419,7 @@ class UISettings constructor(private val notRoamableOptions: NotRoamableUiSettin get() { var result = cachedInstance if (result == null) { - LoadingPhase.CONFIGURATION_STORE_INITIALIZED.assertAtLeast() + LoadingState.CONFIGURATION_STORE_INITIALIZED.checkOccurred() result = ApplicationManager.getApplication().getService(UISettings::class.java)!! cachedInstance = result } @@ -430,7 +430,7 @@ class UISettings constructor(private val notRoamableOptions: NotRoamableUiSettin val instanceOrNull: UISettings? get() { val result = cachedInstance - if (result == null && LoadingPhase.CONFIGURATION_STORE_INITIALIZED.isComplete) { + if (result == null && LoadingState.CONFIGURATION_STORE_INITIALIZED.isOccurred) { return instance } return result @@ -464,7 +464,7 @@ class UISettings constructor(private val notRoamableOptions: NotRoamableUiSettin g as Graphics2D g.setRenderingHint(RenderingHints.KEY_TEXT_LCD_CONTRAST, UIUtil.getLcdContrastValue()) - if (LoadingPhase.CONFIGURATION_STORE_INITIALIZED.isComplete && ApplicationManager.getApplication() == null) { + if (LoadingState.CONFIGURATION_STORE_INITIALIZED.isOccurred && ApplicationManager.getApplication() == null) { // cannot use services while Application has not been loaded yet, so let's apply the default hints GraphicsUtil.applyRenderingHints(g) return diff --git a/platform/platform-api/src/com/intellij/openapi/application/Experiments.java b/platform/platform-api/src/com/intellij/openapi/application/Experiments.java index dfbdb328b587..e81712bba0f0 100644 --- a/platform/platform-api/src/com/intellij/openapi/application/Experiments.java +++ b/platform/platform-api/src/com/intellij/openapi/application/Experiments.java @@ -1,7 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.application; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.components.Service; import com.intellij.openapi.components.ServiceManager; @@ -30,7 +30,7 @@ public final class Experiments { } public boolean isFeatureEnabled(@NotNull String featureId) { - if (!LoadingPhase.COMPONENT_REGISTERED.isComplete()) { + if (!LoadingState.COMPONENTS_REGISTERED.isOccurred()) { return false; } @@ -66,7 +66,7 @@ public final class Experiments { @Nullable private static ExperimentalFeature getFeatureById(@NotNull String featureId) { - if (!LoadingPhase.COMPONENT_REGISTERED.isComplete()) { + if (!LoadingState.COMPONENTS_REGISTERED.isOccurred()) { return null; } return EP_NAME.findFirstSafe(feature -> feature.id.equals(featureId)); diff --git a/platform/platform-api/src/com/intellij/openapi/keymap/KeymapManager.java b/platform/platform-api/src/com/intellij/openapi/keymap/KeymapManager.java index b9bd7dc31b40..c5608cab84bb 100644 --- a/platform/platform-api/src/com/intellij/openapi/keymap/KeymapManager.java +++ b/platform/platform-api/src/com/intellij/openapi/keymap/KeymapManager.java @@ -1,7 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.keymap; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; @@ -26,7 +26,7 @@ public abstract class KeymapManager { public static KeymapManager getInstance() { Application application = ApplicationManager.getApplication(); - if (application == null || !LoadingPhase.CONFIGURATION_STORE_INITIALIZED.isComplete()) { + if (application == null || !LoadingState.CONFIGURATION_STORE_INITIALIZED.isOccurred()) { return null; } diff --git a/platform/platform-api/src/com/intellij/openapi/wm/IdeFocusManager.java b/platform/platform-api/src/com/intellij/openapi/wm/IdeFocusManager.java index 91f392f1a97b..5fdb2c13060d 100644 --- a/platform/platform-api/src/com/intellij/openapi/wm/IdeFocusManager.java +++ b/platform/platform-api/src/com/intellij/openapi/wm/IdeFocusManager.java @@ -1,7 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.wm; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.application.Application; @@ -217,7 +217,7 @@ public abstract class IdeFocusManager implements FocusRequestor { IdeFocusManager focusManager = null; Application app = ApplicationManager.getApplication(); - if (app != null && LoadingPhase.COMPONENT_REGISTERED.isComplete()) { + if (app != null && LoadingState.COMPONENTS_REGISTERED.isOccurred()) { focusManager = app.getComponent(IdeFocusManager.class); } diff --git a/platform/platform-impl/src/com/intellij/diagnostic/DialogAppender.java b/platform/platform-impl/src/com/intellij/diagnostic/DialogAppender.java index 586ae7bd4eef..92f4d4dc5dfe 100644 --- a/platform/platform-impl/src/com/intellij/diagnostic/DialogAppender.java +++ b/platform/platform-impl/src/com/intellij/diagnostic/DialogAppender.java @@ -39,7 +39,7 @@ public class DialogAppender extends AppenderSkeleton { return; // the dialog appender doesn't deal with non-critical errors and is meaningless when there is no frame to show an error icon } - if (LoadingPhase.COMPONENT_LOADED.isComplete()) { + if (LoadingState.COMPONENTS_LOADED.isOccurred()) { LoggingEvent queued; while ((queued = myEarlyEvents.poll()) != null) queueAppend(queued); queueAppend(event); diff --git a/platform/platform-impl/src/com/intellij/diagnostic/GcPauseWatcher.kt b/platform/platform-impl/src/com/intellij/diagnostic/GcPauseWatcher.kt index 543c8a84b9e8..a6f2e83fef5a 100644 --- a/platform/platform-impl/src/com/intellij/diagnostic/GcPauseWatcher.kt +++ b/platform/platform-impl/src/com/intellij/diagnostic/GcPauseWatcher.kt @@ -49,7 +49,7 @@ open class GcPauseWatcher { } protected open fun recordGcPauseTime(name: String, currPauseDuration: Long) { - if (!LoadingPhase.isStartupComplete()) { + if (StartUpMeasurer.isEnabled()) { StartUpMeasurer.addCompletedActivity(StartUpMeasurer.getCurrentTime() - TimeUnit.MILLISECONDS.toNanos(currPauseDuration), Integer.toString(counter.incrementAndGet()), ActivityCategory.GC, null) } } diff --git a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java index 202ae3fcf984..1be274b0e98e 100644 --- a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java +++ b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java @@ -1,7 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.diagnostic.PerformanceWatcher; import com.intellij.ide.actions.MaximizeActiveDialogAction; import com.intellij.ide.dnd.DnDManager; @@ -347,7 +347,7 @@ public final class IdeEventQueue extends EventQueue { return true; } - if (LoadingPhase.COMPONENT_LOADED.isComplete()) { + if (LoadingState.COMPONENTS_LOADED.isOccurred()) { ourAppIsLoaded = true; return true; } @@ -553,7 +553,7 @@ public final class IdeEventQueue extends EventQueue { @Nullable private static PerformanceWatcher obtainPerformanceWatcher() { PerformanceWatcher watcher = ourPerformanceWatcher; - if (watcher == null && LoadingPhase.CONFIGURATION_STORE_INITIALIZED.isComplete()) { + if (watcher == null && LoadingState.CONFIGURATION_STORE_INITIALIZED.isOccurred()) { Application app = ApplicationManager.getApplication(); if (app != null && !app.isDisposed()) { watcher = PerformanceWatcher.getInstance(); diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsState.java b/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsState.java index f0a6670b60d8..121227418377 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsState.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsState.java @@ -1,7 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.plugins; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.openapi.components.Service; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.extensions.PluginId; @@ -23,7 +23,7 @@ import java.util.Set; public final class InstalledPluginsState { @Nullable public static InstalledPluginsState getInstanceIfLoaded() { - return LoadingPhase.COMPONENT_LOADED.isComplete() ? getInstance() : null; + return LoadingState.COMPONENTS_LOADED.isOccurred() ? getInstance() : null; } public static InstalledPluginsState getInstance() { diff --git a/platform/platform-impl/src/com/intellij/idea/ApplicationLoader.kt b/platform/platform-impl/src/com/intellij/idea/ApplicationLoader.kt index f8b320e6e21d..bd5e9ec439d5 100644 --- a/platform/platform-impl/src/com/intellij/idea/ApplicationLoader.kt +++ b/platform/platform-impl/src/com/intellij/idea/ApplicationLoader.kt @@ -415,7 +415,7 @@ fun initConfigurationStore(app: ApplicationImpl, configPath: String?) { // we set it after beforeApplicationLoaded call, because app store can depend on stream provider state app.stateStore.setPath(effectiveConfigPath) - LoadingPhase.setCurrentPhase(LoadingPhase.CONFIGURATION_STORE_INITIALIZED) + StartUpMeasurer.setCurrentState(LoadingState.CONFIGURATION_STORE_INITIALIZED) activity.end() } diff --git a/platform/platform-impl/src/com/intellij/idea/StartupUtil.java b/platform/platform-impl/src/com/intellij/idea/StartupUtil.java index 9652ba1e4a9e..453bfb57e4b5 100644 --- a/platform/platform-impl/src/com/intellij/idea/StartupUtil.java +++ b/platform/platform-impl/src/com/intellij/idea/StartupUtil.java @@ -4,7 +4,7 @@ package com.intellij.idea; import com.intellij.Patches; import com.intellij.concurrency.IdeaForkJoinWorkerThreadFactory; import com.intellij.diagnostic.Activity; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.diagnostic.StartUpMeasurer; import com.intellij.ide.CliResult; import com.intellij.ide.IdeEventQueue; @@ -68,7 +68,7 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; -import static com.intellij.diagnostic.LoadingPhase.LAF_INITIALIZED; +import static com.intellij.diagnostic.LoadingState.LAF_INITIALIZED; import static java.nio.file.attribute.PosixFilePermission.*; public final class StartupUtil { @@ -139,7 +139,7 @@ public final class StartupUtil { } public static void prepareApp(@NotNull String[] args, @NotNull String mainClass) throws Exception { - LoadingPhase.setStrictMode(); + LoadingState.setStrictMode(); Activity activity = StartUpMeasurer.startMainActivity("ForkJoin CommonPool configuration"); IdeaForkJoinWorkerThreadFactory.setupForkJoinCommonPool(Main.isHeadless(args)); @@ -277,7 +277,7 @@ public final class StartupUtil { } future.complete(null); - LoadingPhase.setCurrentPhase(LAF_INITIALIZED); + StartUpMeasurer.setCurrentState(LAF_INITIALIZED); if (Main.isHeadless()) { return; diff --git a/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java b/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java index f60e4d9dfa10..93bd694e8ba2 100644 --- a/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/notification/impl/NotificationsManagerImpl.java @@ -3,7 +3,7 @@ package com.intellij.notification.impl; import com.intellij.application.Topics; import com.intellij.codeInsight.hint.TooltipController; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.icons.AllIcons; import com.intellij.ide.DataManager; import com.intellij.ide.FrameStateListener; @@ -138,7 +138,7 @@ public final class NotificationsManagerImpl extends NotificationsManager { } private static void showNotification(@NotNull final Notification notification, @Nullable final Project project) { - if (!LoadingPhase.COMPONENT_LOADED.isComplete()) { + if (!LoadingState.COMPONENTS_LOADED.isOccurred()) { ApplicationManager.getApplication().invokeLater(() -> showNotification(notification, project), ModalityState.current()); return; } diff --git a/platform/platform-impl/src/com/intellij/openapi/application/ex/ApplicationManagerEx.java b/platform/platform-impl/src/com/intellij/openapi/application/ex/ApplicationManagerEx.java index 554a3a110935..548307fdb3db 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/ex/ApplicationManagerEx.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/ex/ApplicationManagerEx.java @@ -1,7 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.application.ex; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.openapi.application.ApplicationManager; import org.jetbrains.annotations.ApiStatus; @@ -11,11 +11,11 @@ public final class ApplicationManagerEx extends ApplicationManager { } /** - * @deprecated Use {@code LoadingPhase.COMPONENT_LOADED.isComplete()}. + * @deprecated Use {@code LoadingState.COMPONENTS_LOADED.isOccurred()}. */ @Deprecated @ApiStatus.ScheduledForRemoval public static boolean isAppLoaded() { - return LoadingPhase.COMPONENT_LOADED.isComplete(); + return LoadingState.COMPONENTS_LOADED.isOccurred(); } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java index 8dfa4d748764..0067a7fc5b21 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -336,7 +336,7 @@ public class ApplicationImpl extends PlatformComponentManagerImpl implements App else { ProgressManager.getInstance().runProcess(() -> createComponents(indicator), indicator); } - LoadingPhase.setCurrentPhase(LoadingPhase.COMPONENT_LOADED); + StartUpMeasurer.setCurrentState(LoadingState.COMPONENTS_LOADED); } finally { token.finish(); diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java index e5c487c442be..f2ca01b27524 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java @@ -1,7 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.application.impl; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.ide.IdeEventQueue; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.*; @@ -206,7 +206,7 @@ public class LaterInvocator { ourModalityStack.push(appendedState); } - TransactionGuardImpl guard = LoadingPhase.COMPONENT_LOADED.isComplete() ? (TransactionGuardImpl)TransactionGuard.getInstance() : null; + TransactionGuardImpl guard = LoadingState.COMPONENTS_LOADED.isOccurred() ? (TransactionGuardImpl)TransactionGuard.getInstance() : null; if (guard != null) { guard.enteredModality(appendedState); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/EditorColorsManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/EditorColorsManagerImpl.java index 60726909d06d..e2362073fef6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/EditorColorsManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/EditorColorsManagerImpl.java @@ -6,7 +6,7 @@ import com.intellij.configurationStore.BundledSchemeEP; import com.intellij.configurationStore.LazySchemeProcessor; import com.intellij.configurationStore.SchemeDataHolder; import com.intellij.configurationStore.SchemeExtensionProvider; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.ide.WelcomeWizardUtil; import com.intellij.ide.ui.LafManager; import com.intellij.ide.ui.UITheme; @@ -366,7 +366,7 @@ public final class EditorColorsManagerImpl extends EditorColorsManager implement @Override public void setGlobalScheme(@Nullable EditorColorsScheme scheme) { - boolean notify = LoadingPhase.COMPONENT_LOADED.isComplete(); + boolean notify = LoadingState.COMPONENTS_LOADED.isOccurred(); mySchemeManager.setCurrent(scheme == null ? getDefaultScheme() : scheme, notify); } diff --git a/platform/platform-impl/src/com/intellij/openapi/project/DumbServiceImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/DumbServiceImpl.java index 96fe1b0c2803..e5b9058714c7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/DumbServiceImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/DumbServiceImpl.java @@ -2,7 +2,8 @@ package com.intellij.openapi.project; import com.google.common.annotations.VisibleForTesting; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; +import com.intellij.diagnostic.StartUpMeasurer; import com.intellij.diagnostic.ThreadDumper; import com.intellij.ide.IdeBundle; import com.intellij.ide.file.BatchFileChangeListener; @@ -350,7 +351,7 @@ public class DumbServiceImpl extends DumbService implements Disposable, Modifica } } - LoadingPhase.compareAndSet(LoadingPhase.PROJECT_OPENED, LoadingPhase.INDEXING_FINISHED); + StartUpMeasurer.compareAndSetCurrentState(LoadingState.PROJECT_OPENED, LoadingState.INDEXING_FINISHED); myDumbEnterTrace = null; myDumbStart = null; diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java index e6da089abdbc..eb262727b4b7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java @@ -477,10 +477,10 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { StartUpMeasurer.stopPluginCostMeasurement(); }, ModalityState.NON_MODAL, project.getDisposedOrDisposeInProgress()); ApplicationManager.getApplication().invokeLater(() -> { - LoadingPhase.compareAndSet(LoadingPhase.COMPONENT_LOADED, - DumbService.isDumb(project) - ? LoadingPhase.PROJECT_OPENED - : LoadingPhase.INDEXING_FINISHED); + LoadingState phase = DumbService.isDumb(project) + ? LoadingState.PROJECT_OPENED + : LoadingState.INDEXING_FINISHED; + StartUpMeasurer.compareAndSetCurrentState(LoadingState.COMPONENTS_LOADED, phase); if (!project.isDisposedOrDisposeInProgress()) { startupManager.scheduleBackgroundPostStartupActivities(); diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/RefreshProgress.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/RefreshProgress.java index 8c04357b8d08..8fdee34e1783 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/RefreshProgress.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/RefreshProgress.java @@ -1,7 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.vfs.newvfs; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.internal.statistic.DelayedIdeActivity; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; @@ -19,7 +19,7 @@ import org.jetbrains.annotations.NotNull; final class RefreshProgress extends ProgressIndicatorBase { @NotNull public static ProgressIndicator create(@NotNull String message) { - Application app = LoadingPhase.COMPONENT_LOADED.isComplete() ? ApplicationManager.getApplication() : null; + Application app = LoadingState.COMPONENTS_LOADED.isOccurred() ? ApplicationManager.getApplication() : null; return app == null || app.isUnitTestMode() ? new EmptyProgressIndicator() : new RefreshProgress(message); } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeFrameImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeFrameImpl.java index 84300afc7cb4..65bb5a8db7f1 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeFrameImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeFrameImpl.java @@ -1,7 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.wm.impl; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.ide.ui.UISettings; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.project.Project; @@ -100,7 +100,7 @@ public final class IdeFrameImpl extends JFrame implements IdeFrame, DataProvider @Override public void setExtendedState(int state) { // do not load FrameInfoHelper class - if (LoadingPhase.COMPONENT_REGISTERED.isComplete() && getExtendedState() == Frame.NORMAL && FrameInfoHelper.isMaximized(state)) { + if (LoadingState.COMPONENTS_REGISTERED.isOccurred() && getExtendedState() == Frame.NORMAL && FrameInfoHelper.isMaximized(state)) { getRootPane().putClientProperty(NORMAL_STATE_BOUNDS, getBounds()); } super.setExtendedState(state); @@ -108,7 +108,7 @@ public final class IdeFrameImpl extends JFrame implements IdeFrame, DataProvider @Override public void paint(@NotNull Graphics g) { - if (LoadingPhase.COMPONENT_REGISTERED.isComplete()) { + if (LoadingState.COMPONENTS_REGISTERED.isOccurred()) { UISettings.setupAntialiasing(g); } diff --git a/platform/platform-impl/src/com/intellij/ui/mac/MacOSApplicationProvider.java b/platform/platform-impl/src/com/intellij/ui/mac/MacOSApplicationProvider.java index bdddedb7a917..6fec0f444901 100644 --- a/platform/platform-impl/src/com/intellij/ui/mac/MacOSApplicationProvider.java +++ b/platform/platform-impl/src/com/intellij/ui/mac/MacOSApplicationProvider.java @@ -2,7 +2,7 @@ package com.intellij.ui.mac; import com.apple.eawt.Application; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.ide.DataManager; import com.intellij.ide.actions.AboutAction; import com.intellij.ide.actions.ShowSettingsAction; @@ -69,7 +69,7 @@ public final class MacOSApplicationProvider { application.setOpenFileHandler(event -> { List files = event.getFiles(); if (files.isEmpty()) return; - if (LoadingPhase.COMPONENT_LOADED.isComplete()) { + if (LoadingState.COMPONENTS_LOADED.isOccurred()) { Project project = getProject(false); submit("OpenFile", () -> ProjectUtil.tryOpenFileList(project, files, "MacMenu")); } diff --git a/platform/platform-impl/src/com/intellij/ui/messages/MessagesServiceImpl.java b/platform/platform-impl/src/com/intellij/ui/messages/MessagesServiceImpl.java index 29f351559942..a799bc51e1b6 100644 --- a/platform/platform-impl/src/com/intellij/ui/messages/MessagesServiceImpl.java +++ b/platform/platform-impl/src/com/intellij/ui/messages/MessagesServiceImpl.java @@ -1,7 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ui.messages; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.*; @@ -52,7 +52,7 @@ public class MessagesServiceImpl implements MessagesService { try { if (canShowMacSheetPanel() && !alwaysUseIdeaUI) { - WindowManager windowManager = LoadingPhase.COMPONENT_REGISTERED.isComplete() ? WindowManager.getInstance() : null; + WindowManager windowManager = LoadingState.COMPONENTS_REGISTERED.isOccurred() ? WindowManager.getInstance() : null; if (windowManager != null) { Window parentWindow = windowManager.suggestParentWindow(project); return MacMessages.getInstance() diff --git a/platform/service-container/src/com/intellij/ide/plugins/StartupAbortedException.java b/platform/service-container/src/com/intellij/ide/plugins/StartupAbortedException.java index c8aa8ba58754..a3f1724db34b 100644 --- a/platform/service-container/src/com/intellij/ide/plugins/StartupAbortedException.java +++ b/platform/service-container/src/com/intellij/ide/plugins/StartupAbortedException.java @@ -2,7 +2,7 @@ package com.intellij.ide.plugins; import com.intellij.diagnostic.ImplementationConflictException; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.diagnostic.PluginException; import com.intellij.idea.Main; import com.intellij.openapi.application.ApplicationManager; @@ -23,7 +23,7 @@ public final class StartupAbortedException extends RuntimeException { } public static void processException(@NotNull Throwable t) { - if (LoadingPhase.COMPONENT_LOADED.isComplete() && !(t instanceof StartupAbortedException)) { + if (LoadingState.COMPONENTS_LOADED.isOccurred() && !(t instanceof StartupAbortedException)) { if (!(t instanceof ProcessCanceledException)) { PluginManagerCore.getLogger().error(t); } @@ -54,7 +54,7 @@ public final class StartupAbortedException extends RuntimeException { } } - if (LoadingPhase.COMPONENT_REGISTERED.isComplete()) { + if (LoadingState.COMPONENTS_REGISTERED.isOccurred()) { ImplementationConflictException conflictException = findCause(t, ImplementationConflictException.class); if (conflictException != null) { PluginConflictReporter pluginConflictReporter = ApplicationManager.getApplication().getService(PluginConflictReporter.class); diff --git a/platform/service-container/src/com/intellij/serviceContainer/BaseComponentAdapter.kt b/platform/service-container/src/com/intellij/serviceContainer/BaseComponentAdapter.kt index 00abdab34f49..6eb675486d1b 100644 --- a/platform/service-container/src/com/intellij/serviceContainer/BaseComponentAdapter.kt +++ b/platform/service-container/src/com/intellij/serviceContainer/BaseComponentAdapter.kt @@ -2,7 +2,7 @@ package com.intellij.serviceContainer import com.intellij.diagnostic.ActivityCategory -import com.intellij.diagnostic.LoadingPhase +import com.intellij.diagnostic.LoadingState import com.intellij.diagnostic.PluginException import com.intellij.diagnostic.StartUpMeasurer import com.intellij.openapi.Disposable @@ -73,7 +73,7 @@ internal abstract class BaseComponentAdapter(internal val componentManager: Plat } private fun getInstanceUncached(componentManager: PlatformComponentManagerImpl, indicator: ProgressIndicator?): T? { - LoadingPhase.COMPONENT_REGISTERED.assertAtLeast() + LoadingState.COMPONENTS_REGISTERED.checkOccurred() checkContainerIsActive(componentManager, indicator) val activityCategory = if (StartUpMeasurer.isEnabled()) getActivityCategory(componentManager) else null diff --git a/platform/service-container/src/com/intellij/serviceContainer/PlatformComponentManagerImpl.kt b/platform/service-container/src/com/intellij/serviceContainer/PlatformComponentManagerImpl.kt index e1b0438a6429..1b702ab45c8c 100644 --- a/platform/service-container/src/com/intellij/serviceContainer/PlatformComponentManagerImpl.kt +++ b/platform/service-container/src/com/intellij/serviceContainer/PlatformComponentManagerImpl.kt @@ -1,7 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.serviceContainer -import com.intellij.diagnostic.LoadingPhase +import com.intellij.diagnostic.LoadingState import com.intellij.diagnostic.PluginException import com.intellij.diagnostic.StartUpMeasurer import com.intellij.ide.plugins.* @@ -137,7 +137,7 @@ abstract class PlatformComponentManagerImpl @JvmOverloads constructor(internal v activity = activity.endAndStart("${activityNamePrefix}extension registration") } - val notifyListeners = LoadingPhase.PROJECT_OPENED.isComplete + val notifyListeners = LoadingState.PROJECT_OPENED.isOccurred for (descriptor in plugins) { descriptor.registerExtensions(extensionArea, this, notifyListeners) } @@ -148,8 +148,8 @@ abstract class PlatformComponentManagerImpl @JvmOverloads constructor(internal v } // app - phase must be set before getMessageBus() - if (picoContainer.parent == null && !LoadingPhase.PROJECT_OPENED.isComplete /* loading plugin on the fly */) { - LoadingPhase.setCurrentPhase(LoadingPhase.COMPONENT_REGISTERED) + if (picoContainer.parent == null && !LoadingState.PROJECT_OPENED.isOccurred /* loading plugin on the fly */) { + StartUpMeasurer.setCurrentState(LoadingState.COMPONENTS_REGISTERED) } // todo support lazy listeners for dynamically loaded plugins @@ -254,7 +254,7 @@ abstract class PlatformComponentManagerImpl @JvmOverloads constructor(internal v @Internal fun initializeComponent(component: Any, serviceDescriptor: ServiceDescriptor?) { if (serviceDescriptor == null || !(component is PathMacroManager || component is IComponentStore || component is MessageBusFactory)) { - LoadingPhase.CONFIGURATION_STORE_INITIALIZED.assertAtLeast() + LoadingState.CONFIGURATION_STORE_INITIALIZED.checkOccurred() componentStore.initComponent(component, serviceDescriptor) } } @@ -332,7 +332,7 @@ abstract class PlatformComponentManagerImpl @JvmOverloads constructor(internal v } private fun getOrCreateLightService(serviceClass: Class, cache: ConcurrentMap, Any>): T { - LoadingPhase.COMPONENT_REGISTERED.assertAtLeast() + LoadingState.COMPONENTS_REGISTERED.checkOccurred() @Suppress("UNCHECKED_CAST") var result = cache.get(serviceClass) as T? diff --git a/platform/util/src/com/intellij/diagnostic/ActivityImpl.java b/platform/util/src/com/intellij/diagnostic/ActivityImpl.java index 9535f08fc3d4..fd44edf20ee1 100644 --- a/platform/util/src/com/intellij/diagnostic/ActivityImpl.java +++ b/platform/util/src/com/intellij/diagnostic/ActivityImpl.java @@ -106,7 +106,7 @@ public final class ActivityImpl implements Activity { public void end() { assert end == 0 : "not started or already ended"; end = StartUpMeasurer.getCurrentTime(); - StartUpMeasurer.add(this); + StartUpMeasurer.addActivity(this); } @Override diff --git a/platform/util/src/com/intellij/diagnostic/LoadingPhase.java b/platform/util/src/com/intellij/diagnostic/LoadingState.java similarity index 55% rename from platform/util/src/com/intellij/diagnostic/LoadingPhase.java rename to platform/util/src/com/intellij/diagnostic/LoadingState.java index 9cc2ccd88a54..1d8b34b9e7ab 100644 --- a/platform/util/src/com/intellij/diagnostic/LoadingPhase.java +++ b/platform/util/src/com/intellij/diagnostic/LoadingState.java @@ -10,44 +10,36 @@ import org.jetbrains.annotations.NotNull; import java.util.Arrays; import java.util.Set; -import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @ApiStatus.Internal -public enum LoadingPhase { +public enum LoadingState { BOOTSTRAP("bootstrap"), LAF_INITIALIZED("LaF is initialized"), - COMPONENT_REGISTERED("app component registered"), + COMPONENTS_REGISTERED("app component registered"), CONFIGURATION_STORE_INITIALIZED("app store initialized"), - COMPONENT_LOADED("app component loaded"), + COMPONENTS_LOADED("app component loaded"), PROJECT_OPENED("project opened"), INDEXING_FINISHED("indexing finished"); - private final String displayName; + final String displayName; - LoadingPhase(@NotNull String displayName) { + private static boolean CHECK_LOADING_PHASE; + + LoadingState(@NotNull String displayName) { this.displayName = displayName; } @NotNull - private static Logger getLogger() { - return Logger.getInstance(LoadingPhase.class); + static Logger getLogger() { + return Logger.getInstance("#com.intellij.diagnostic.LoadingState"); } - private static boolean CHECK_LOADING_PHASE; - + @ApiStatus.Internal public static void setStrictMode() { CHECK_LOADING_PHASE = true; } - public static void setCurrentPhase(@NotNull LoadingPhase phase) { - LoadingPhase old = currentPhase.getAndSet(phase); - if (old.ordinal() > phase.ordinal()) { - getLogger().error("New phase " + phase + " cannot be earlier than old " + old); - } - logPhaseSet(phase); - } - private final static Set stackTraces = new THashSet<>(new TObjectHashingStrategy() { @Override public int computeHashCode(Throwable throwable) { @@ -69,29 +61,13 @@ public enum LoadingPhase { } }); - private final static AtomicReference currentPhase = new AtomicReference<>(BOOTSTRAP); - - public static void compareAndSet(@NotNull LoadingPhase expect, @NotNull LoadingPhase phase) { - if (currentPhase.compareAndSet(expect, phase)) { - logPhaseSet(phase); - } - } - - private static void logPhaseSet(@NotNull LoadingPhase phase) { - StartUpMeasurer.addInstantEvent(phase.displayName); - - if (phase.ordinal() >= CONFIGURATION_STORE_INITIALIZED.ordinal()) { - getLogger().info("Reached the loading phase " + phase); - } - } - - public void assertAtLeast() { + public void checkOccurred() { if (!CHECK_LOADING_PHASE) { return; } - LoadingPhase currentPhase = LoadingPhase.currentPhase.get(); - if (currentPhase.ordinal() >= ordinal() || isKnownViolator()) { + LoadingState currentState = StartUpMeasurer.currentState.get(); + if (currentState.ordinal() >= ordinal() || isKnownViolator()) { return; } @@ -101,9 +77,9 @@ public enum LoadingPhase { return; } - getLogger().error("Should be called at least at the phase " + this + ", the current phase is: " + currentPhase + "\n" + - "Current violators count: " + stackTraces.size() + "\n\n", - t); + getLogger().error("Should be called at least in the state " + this + ", the current state is: " + currentState + "\n" + + "Current violators count: " + stackTraces.size() + "\n\n", + t); } } @@ -117,11 +93,7 @@ public enum LoadingPhase { return false; } - public static boolean isStartupComplete() { - return INDEXING_FINISHED.isComplete(); - } - - public boolean isComplete() { - return currentPhase.get().ordinal() >= ordinal(); + public boolean isOccurred() { + return StartUpMeasurer.currentState.get().ordinal() >= ordinal(); } } \ No newline at end of file diff --git a/platform/util/src/com/intellij/diagnostic/StartUpMeasurer.java b/platform/util/src/com/intellij/diagnostic/StartUpMeasurer.java index 0c5af3f8b52c..022ac9b490ed 100644 --- a/platform/util/src/com/intellij/diagnostic/StartUpMeasurer.java +++ b/platform/util/src/com/intellij/diagnostic/StartUpMeasurer.java @@ -9,9 +9,12 @@ import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; public final class StartUpMeasurer { + final static AtomicReference currentState = new AtomicReference<>(LoadingState.BOOTSTRAP); + public static final long MEASURE_THRESHOLD = TimeUnit.MILLISECONDS.toNanos(10); // `what + noun` is used as scheme for name to make analyzing easier (to visually group - `components loading/initialization/etc`, @@ -77,9 +80,13 @@ public final class StartUpMeasurer { * Scope is not supported — reported as global. */ public static void addInstantEvent(@NotNull String name) { + if (!isEnabled) { + return; + } + ActivityImpl activity = new ActivityImpl(name, null); activity.setEnd(-1); - add(activity); + addActivity(activity); } @NotNull @@ -140,15 +147,36 @@ public final class StartUpMeasurer { return duration; } - @NotNull - public static Activity addCompletedActivity(long start, long end, @NotNull String name, @NotNull ActivityCategory category, String pluginId) { + public static void addCompletedActivity(long start, long end, @NotNull String name, @NotNull ActivityCategory category, String pluginId) { + if (!isEnabled) { + return; + } + ActivityImpl item = new ActivityImpl(name, start, /* parent = */ null, pluginId); item.setCategory(category); item.setEnd(end); - add(item); - return item; + addActivity(item); } + public static void setCurrentState(@NotNull LoadingState state) { + LoadingState old = currentState.getAndSet(state); + if (old.ordinal() > state.ordinal()) { + LoadingState.getLogger().error("New state " + state + " cannot precede old " + old); + } + stateSet(state); + } + + public static void compareAndSetCurrentState(@NotNull LoadingState expectedState, @NotNull LoadingState newState) { + if (currentState.compareAndSet(expectedState, newState)) { + stateSet(newState); + } + } + + private static void stateSet(@NotNull LoadingState state) { + addInstantEvent(state.displayName); + } + + @ApiStatus.Internal public static void processAndClear(boolean isContinueToCollect, @NotNull Consumer consumer) { isEnabled = isContinueToCollect; @@ -167,12 +195,11 @@ public final class StartUpMeasurer { return startTime; } - static void add(@NotNull ActivityImpl activity) { - if (isEnabled) { - items.add(activity); - } + static void addActivity(@NotNull ActivityImpl activity) { + items.add(activity); } + @ApiStatus.Internal public static void addTimings(@NotNull LinkedHashMap timings, @NotNull String groupName) { if (!items.isEmpty()) { throw new IllegalStateException("addTimings must be not called if some events were already added using API"); @@ -200,6 +227,7 @@ public final class StartUpMeasurer { items.add(parent); } + @ApiStatus.Internal public static void addPluginCost(@NotNull String pluginId, @NotNull String phase, long time) { if (!isMeasuringPluginStartupCosts()) { return; diff --git a/platform/util/src/com/intellij/openapi/util/registry/Registry.java b/platform/util/src/com/intellij/openapi/util/registry/Registry.java index a4874af428f9..adb8ca98d0f1 100644 --- a/platform/util/src/com/intellij/openapi/util/registry/Registry.java +++ b/platform/util/src/com/intellij/openapi/util/registry/Registry.java @@ -1,7 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.util.registry; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.util.ConcurrencyUtil; import gnu.trove.THashMap; import org.jdom.Element; @@ -48,8 +48,8 @@ public final class Registry { } public static boolean is(@NotNull String key, boolean defaultValue) { - if (!LoadingPhase.COMPONENT_REGISTERED.isComplete()) { - LoadingPhase.LAF_INITIALIZED.assertAtLeast(); + if (!LoadingState.COMPONENTS_REGISTERED.isOccurred()) { + LoadingState.LAF_INITIALIZED.checkOccurred(); return defaultValue; } @@ -66,8 +66,8 @@ public final class Registry { } public static int intValue(@NotNull String key, int defaultValue) { - if (!LoadingPhase.COMPONENT_REGISTERED.isComplete()) { - LoadingPhase.LAF_INITIALIZED.assertAtLeast(); + if (!LoadingState.COMPONENTS_REGISTERED.isOccurred()) { + LoadingState.LAF_INITIALIZED.checkOccurred(); return defaultValue; } @@ -122,7 +122,7 @@ public final class Registry { @NotNull public static Registry getInstance() { - LoadingPhase.COMPONENT_REGISTERED.assertAtLeast(); + LoadingState.COMPONENTS_REGISTERED.checkOccurred(); return ourInstance; } diff --git a/platform/util/ui/src/com/intellij/util/ui/UIUtil.java b/platform/util/ui/src/com/intellij/util/ui/UIUtil.java index deb2e34694d8..b48d118e5f71 100644 --- a/platform/util/ui/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/ui/src/com/intellij/util/ui/UIUtil.java @@ -2,7 +2,7 @@ package com.intellij.util.ui; import com.intellij.BundleBase; -import com.intellij.diagnostic.LoadingPhase; +import com.intellij.diagnostic.LoadingState; import com.intellij.icons.AllIcons; import com.intellij.openapi.Disposable; import com.intellij.openapi.diagnostic.Logger; @@ -80,7 +80,7 @@ import java.util.regex.Pattern; public final class UIUtil extends StartupUiUtil { static { - LoadingPhase.LAF_INITIALIZED.assertAtLeast(); + LoadingState.LAF_INITIALIZED.checkOccurred(); } public static final String BORDER_LINE = "
";