From bb251bc85dee577226584aaef6ea149498baa71a Mon Sep 17 00:00:00 2001 From: Alexander Zolotov Date: Fri, 5 Jun 2020 17:11:32 +0300 Subject: [PATCH] [platform] extract diagnostic util module GitOrigin-RevId: 83cc6a2b2885d04face03fcf6d796889c0f47cdc --- .idea/modules.xml | 1 + .../CommunityStandaloneJpsBuilder.groovy | 1 + .../build/IntelliJCoreArtifactsBuilder.groovy | 2 ++ .../build/impl/DistributionJARsBuilder.groovy | 1 + .../src/com/intellij/idea/StartupUtil.java | 1 + .../intellij.platform.util.diagnostic.iml | 13 +++++++ .../src/com/intellij/diagnostic/Activity.java | 2 +- .../intellij/diagnostic/ActivityCategory.java | 0 .../com/intellij/diagnostic/ActivityImpl.java | 0 .../com/intellij/diagnostic/LoadingState.java | 34 ++++++++++++------- .../intellij/diagnostic/StartUpMeasurer.java | 8 +++-- .../com/intellij/diagnostic/ThreadDump.java | 2 +- .../com/intellij/diagnostic/ThreadDumper.java | 2 +- platform/util/intellij.platform.util.iml | 1 + .../openapi/application/PathManager.java | 2 ++ .../SnapShooterConfigurationExtension.java | 2 ++ .../uiDesigner/core/AsmCodeGeneratorTest.java | 2 ++ 17 files changed, 57 insertions(+), 17 deletions(-) create mode 100644 platform/util/diagnostic/intellij.platform.util.diagnostic.iml rename platform/util/{ => diagnostic}/src/com/intellij/diagnostic/Activity.java (90%) rename platform/util/{ => diagnostic}/src/com/intellij/diagnostic/ActivityCategory.java (100%) rename platform/util/{ => diagnostic}/src/com/intellij/diagnostic/ActivityImpl.java (100%) rename platform/util/{ => diagnostic}/src/com/intellij/diagnostic/LoadingState.java (72%) rename platform/util/{ => diagnostic}/src/com/intellij/diagnostic/StartUpMeasurer.java (96%) rename platform/util/{ => diagnostic}/src/com/intellij/diagnostic/ThreadDump.java (94%) rename platform/util/{ => diagnostic}/src/com/intellij/diagnostic/ThreadDumper.java (99%) diff --git a/.idea/modules.xml b/.idea/modules.xml index a6767cd19cf0..e8e00881148e 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -709,6 +709,7 @@ + diff --git a/build/groovy/org/jetbrains/intellij/build/CommunityStandaloneJpsBuilder.groovy b/build/groovy/org/jetbrains/intellij/build/CommunityStandaloneJpsBuilder.groovy index 1927f8dfd6ef..ed0f9f80ff48 100644 --- a/build/groovy/org/jetbrains/intellij/build/CommunityStandaloneJpsBuilder.groovy +++ b/build/groovy/org/jetbrains/intellij/build/CommunityStandaloneJpsBuilder.groovy @@ -26,6 +26,7 @@ class CommunityStandaloneJpsBuilder { module("intellij.platform.util.text.matching") module("intellij.platform.util.collections") module("intellij.platform.util.strings") + module("intellij.platform.util.diagnostic") } jar("jps-launcher.jar") { diff --git a/build/groovy/org/jetbrains/intellij/build/IntelliJCoreArtifactsBuilder.groovy b/build/groovy/org/jetbrains/intellij/build/IntelliJCoreArtifactsBuilder.groovy index c0d7ecfa9d37..be4269724f43 100644 --- a/build/groovy/org/jetbrains/intellij/build/IntelliJCoreArtifactsBuilder.groovy +++ b/build/groovy/org/jetbrains/intellij/build/IntelliJCoreArtifactsBuilder.groovy @@ -34,6 +34,7 @@ class IntelliJCoreArtifactsBuilder { "intellij.platform.util.text.matching", "intellij.platform.util.collections", "intellij.platform.util.strings", + "intellij.platform.util.diagnostic", "intellij.platform.util.classLoader", "intellij.xml.analysis", "intellij.xml.psi", @@ -112,6 +113,7 @@ class IntelliJCoreArtifactsBuilder { module("intellij.platform.util.text.matching") module("intellij.platform.util.collections") module("intellij.platform.util.strings") + module("intellij.platform.util.diagnostic") module("intellij.platform.util") module("intellij.platform.core") module("intellij.platform.core.impl") diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.groovy index 95d88fc1f08e..a70ec210ad03 100644 --- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.groovy +++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.groovy @@ -151,6 +151,7 @@ class DistributionJARsBuilder { addModule("intellij.platform.util.text.matching", "util.jar") addModule("intellij.platform.util.collections", "util.jar") addModule("intellij.platform.util.strings", "util.jar") + addModule("intellij.platform.util.diagnostic", "util.jar") addModule("intellij.platform.util.ui") addModule("intellij.platform.util.ex") addModule("intellij.platform.rd.community") diff --git a/platform/platform-impl/src/com/intellij/idea/StartupUtil.java b/platform/platform-impl/src/com/intellij/idea/StartupUtil.java index d221c79b77a8..7cd0807480d2 100644 --- a/platform/platform-impl/src/com/intellij/idea/StartupUtil.java +++ b/platform/platform-impl/src/com/intellij/idea/StartupUtil.java @@ -164,6 +164,7 @@ public final class StartupUtil { public static void prepareApp(@NotNull String @NotNull [] args, @NotNull String mainClass) throws Exception { LoadingState.setStrictMode(); + LoadingState.setErrorHandler((message, throwable) -> Logger.getInstance(LoadingState.class).error(message, throwable)); Activity activity = StartUpMeasurer.startMainActivity("ForkJoin CommonPool configuration"); IdeaForkJoinWorkerThreadFactory.setupForkJoinCommonPool(Main.isHeadless(args)); diff --git a/platform/util/diagnostic/intellij.platform.util.diagnostic.iml b/platform/util/diagnostic/intellij.platform.util.diagnostic.iml new file mode 100644 index 000000000000..eac606a86464 --- /dev/null +++ b/platform/util/diagnostic/intellij.platform.util.diagnostic.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/platform/util/src/com/intellij/diagnostic/Activity.java b/platform/util/diagnostic/src/com/intellij/diagnostic/Activity.java similarity index 90% rename from platform/util/src/com/intellij/diagnostic/Activity.java rename to platform/util/diagnostic/src/com/intellij/diagnostic/Activity.java index 675a5d69d8cb..98f881cecd56 100644 --- a/platform/util/src/com/intellij/diagnostic/Activity.java +++ b/platform/util/diagnostic/src/com/intellij/diagnostic/Activity.java @@ -1,4 +1,4 @@ -// 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. +// Copyright 2000-2020 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.diagnostic; import org.jetbrains.annotations.NonNls; diff --git a/platform/util/src/com/intellij/diagnostic/ActivityCategory.java b/platform/util/diagnostic/src/com/intellij/diagnostic/ActivityCategory.java similarity index 100% rename from platform/util/src/com/intellij/diagnostic/ActivityCategory.java rename to platform/util/diagnostic/src/com/intellij/diagnostic/ActivityCategory.java diff --git a/platform/util/src/com/intellij/diagnostic/ActivityImpl.java b/platform/util/diagnostic/src/com/intellij/diagnostic/ActivityImpl.java similarity index 100% rename from platform/util/src/com/intellij/diagnostic/ActivityImpl.java rename to platform/util/diagnostic/src/com/intellij/diagnostic/ActivityImpl.java diff --git a/platform/util/src/com/intellij/diagnostic/LoadingState.java b/platform/util/diagnostic/src/com/intellij/diagnostic/LoadingState.java similarity index 72% rename from platform/util/src/com/intellij/diagnostic/LoadingState.java rename to platform/util/diagnostic/src/com/intellij/diagnostic/LoadingState.java index ad01b52ea2c4..521748964570 100644 --- a/platform/util/src/com/intellij/diagnostic/LoadingState.java +++ b/platform/util/diagnostic/src/com/intellij/diagnostic/LoadingState.java @@ -1,13 +1,14 @@ -// 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. +// Copyright 2000-2020 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.diagnostic; -import com.intellij.openapi.diagnostic.Logger; -import gnu.trove.THashSet; -import gnu.trove.TObjectHashingStrategy; +import it.unimi.dsi.fastutil.Hash; +import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Set; +import java.util.function.BiConsumer; @ApiStatus.Internal public enum LoadingState { @@ -22,6 +23,7 @@ public enum LoadingState { final String displayName; + private static BiConsumer errorHandler; private static boolean CHECK_LOADING_PHASE; private static Set stackTraces; @@ -29,9 +31,14 @@ public enum LoadingState { this.displayName = displayName; } - @NotNull - static Logger getLogger() { - return Logger.getInstance(LoadingState.class); + @Nullable + static BiConsumer getErrorHandler() { + return errorHandler; + } + + @ApiStatus.Internal + public static void setErrorHandler(@NotNull BiConsumer errorHandler) { + LoadingState.errorHandler = errorHandler; } @ApiStatus.Internal @@ -56,9 +63,9 @@ public enum LoadingState { Throwable t = new Throwable(); if (stackTraces == null) { //noinspection AssignmentToStaticFieldFromInstanceMethod - stackTraces = new THashSet<>(new TObjectHashingStrategy() { + stackTraces = new ObjectOpenCustomHashSet<>(new Hash.Strategy() { @Override - public int computeHashCode(Throwable throwable) { + public int hashCode(Throwable throwable) { return fingerprint(throwable).hashCode(); } @@ -81,9 +88,12 @@ public enum LoadingState { return; } - 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); + BiConsumer errorHandler = getErrorHandler(); + if (errorHandler != null) { + errorHandler.accept("Should be called at least in the state " + this + ", the current state is: " + currentState + "\n" + + "Current violators count: " + stackTraces.size() + "\n\n", + t); + } } private static boolean isKnownViolator() { diff --git a/platform/util/src/com/intellij/diagnostic/StartUpMeasurer.java b/platform/util/diagnostic/src/com/intellij/diagnostic/StartUpMeasurer.java similarity index 96% rename from platform/util/src/com/intellij/diagnostic/StartUpMeasurer.java rename to platform/util/diagnostic/src/com/intellij/diagnostic/StartUpMeasurer.java index b5b12600f945..c44d7cb1b2ac 100644 --- a/platform/util/src/com/intellij/diagnostic/StartUpMeasurer.java +++ b/platform/util/diagnostic/src/com/intellij/diagnostic/StartUpMeasurer.java @@ -9,6 +9,7 @@ import java.util.*; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.BiConsumer; import java.util.function.Consumer; public final class StartUpMeasurer { @@ -152,8 +153,11 @@ public final class StartUpMeasurer { public static void setCurrentState(@NotNull LoadingState state) { LoadingState old = currentState.getAndSet(state); - if (old.compareTo(state)>0) { - LoadingState.getLogger().error("New state " + state + " cannot precede old " + old); + if (old.compareTo(state) > 0) { + BiConsumer errorHandler = LoadingState.getErrorHandler(); + if (errorHandler != null) { + errorHandler.accept("New state " + state + " cannot precede old " + old, new Throwable()); + } } stateSet(state); } diff --git a/platform/util/src/com/intellij/diagnostic/ThreadDump.java b/platform/util/diagnostic/src/com/intellij/diagnostic/ThreadDump.java similarity index 94% rename from platform/util/src/com/intellij/diagnostic/ThreadDump.java rename to platform/util/diagnostic/src/com/intellij/diagnostic/ThreadDump.java index 1c817e3802a7..e71aaa02cbf5 100644 --- a/platform/util/src/com/intellij/diagnostic/ThreadDump.java +++ b/platform/util/diagnostic/src/com/intellij/diagnostic/ThreadDump.java @@ -1,4 +1,4 @@ -// 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. +// Copyright 2000-2020 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.diagnostic; import org.jetbrains.annotations.NotNull; diff --git a/platform/util/src/com/intellij/diagnostic/ThreadDumper.java b/platform/util/diagnostic/src/com/intellij/diagnostic/ThreadDumper.java similarity index 99% rename from platform/util/src/com/intellij/diagnostic/ThreadDumper.java rename to platform/util/diagnostic/src/com/intellij/diagnostic/ThreadDumper.java index eb49de738cf7..df217cd2ab93 100644 --- a/platform/util/src/com/intellij/diagnostic/ThreadDumper.java +++ b/platform/util/diagnostic/src/com/intellij/diagnostic/ThreadDumper.java @@ -1,4 +1,4 @@ -// 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. +// Copyright 2000-2020 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.diagnostic; import org.jetbrains.annotations.NonNls; diff --git a/platform/util/intellij.platform.util.iml b/platform/util/intellij.platform.util.iml index 910721fde504..727e0d8322dc 100644 --- a/platform/util/intellij.platform.util.iml +++ b/platform/util/intellij.platform.util.iml @@ -25,6 +25,7 @@ + diff --git a/platform/util/src/com/intellij/openapi/application/PathManager.java b/platform/util/src/com/intellij/openapi/application/PathManager.java index 6752a1f3fd4d..512d65361ae6 100644 --- a/platform/util/src/com/intellij/openapi/application/PathManager.java +++ b/platform/util/src/com/intellij/openapi/application/PathManager.java @@ -1,6 +1,7 @@ // Copyright 2000-2020 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.StartUpMeasurer; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.PropertiesUtil; import com.intellij.openapi.util.SystemInfoRt; @@ -554,6 +555,7 @@ public final class PathManager { Strings.class, // module 'intellij.platform.util.strings' FList.class, // module 'intellij.platform.util.collections' MinusculeMatcher.class, // module 'intellij.platform.util.text.matching' + StartUpMeasurer.class, // module 'intellij.platform.util.diagnostic' com.intellij.openapi.util.SystemInfoRt.class, // module 'intellij.platform.util.rt' com.intellij.util.lang.UrlClassLoader.class, // module 'intellij.platform.util.classLoader' org.intellij.lang.annotations.Flow.class, // jetbrains-annotations-java5 diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/snapShooter/SnapShooterConfigurationExtension.java b/plugins/ui-designer/src/com/intellij/uiDesigner/snapShooter/SnapShooterConfigurationExtension.java index 3ac7161012a5..b4eaea7a8fc5 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/snapShooter/SnapShooterConfigurationExtension.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/snapShooter/SnapShooterConfigurationExtension.java @@ -3,6 +3,7 @@ package com.intellij.uiDesigner.snapShooter; import com.intellij.designer.DesignerEditorPanelFacade; +import com.intellij.diagnostic.StartUpMeasurer; import com.intellij.execution.RunConfigurationExtension; import com.intellij.execution.application.ApplicationConfiguration; import com.intellij.execution.configurations.JavaParameters; @@ -80,6 +81,7 @@ public class SnapShooterConfigurationExtension extends RunConfigurationExtension paths.add(PathUtil.getJarPathForClass(Strings.class)); // intellij.platform.util.strings paths.add(PathUtil.getJarPathForClass(FList.class)); // intellij.platform.util.collections paths.add(PathUtil.getJarPathForClass(MinusculeMatcher.class)); // intellij.platform.util.text.matching + paths.add(PathUtil.getJarPathForClass(StartUpMeasurer.class)); // intellij.platform.util.diagnostic paths.add(PathUtil.getJarPathForClass(UrlClassLoader.class)); // intellij.platform.util.classLoader paths.add(PathUtil.getJarPathForClass(Navigatable.class)); // intellij.platform.core paths.add(PathUtil.getJarPathForClass(AreaInstance.class)); // intellij.platform.extensions diff --git a/plugins/ui-designer/testSrc/com/intellij/uiDesigner/core/AsmCodeGeneratorTest.java b/plugins/ui-designer/testSrc/com/intellij/uiDesigner/core/AsmCodeGeneratorTest.java index faf7e9b13cec..932f64fff14d 100644 --- a/plugins/ui-designer/testSrc/com/intellij/uiDesigner/core/AsmCodeGeneratorTest.java +++ b/plugins/ui-designer/testSrc/com/intellij/uiDesigner/core/AsmCodeGeneratorTest.java @@ -3,6 +3,7 @@ package com.intellij.uiDesigner.core; import com.intellij.DynamicBundle; import com.intellij.compiler.instrumentation.InstrumentationClassFinder; +import com.intellij.diagnostic.StartUpMeasurer; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathManager; @@ -92,6 +93,7 @@ public class AsmCodeGeneratorTest extends JpsBuildTestCase { appendPath(cp, KDeclarationContainer.class); appendPath(cp, NotNullProducer.class); // intellij.platform.util appendPath(cp, Strings.class); // intellij.platform.util.strings + appendPath(cp, StartUpMeasurer.class); // intellij.platform.util.diagnostic appendPath(cp, NotNullFunction.class); // intellij.platform.util.rt appendPath(cp, SimpleTextAttributes.class); myClassFinder = new MyClassFinder(new URL[]{url}, cp.toArray(new URL[0]));