From 94d7f0dd3e53b2425c9757bbd6a298ec36545c1e Mon Sep 17 00:00:00 2001 From: Egor Ushakov Date: Thu, 3 Oct 2019 14:36:33 +0300 Subject: [PATCH] track freeze in nested dispatching GitOrigin-RevId: 5af790969b59231c000989edf9752d8314c0b371 --- .../diagnostic/PerformanceWatcher.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/platform/core-impl/src/com/intellij/diagnostic/PerformanceWatcher.java b/platform/core-impl/src/com/intellij/diagnostic/PerformanceWatcher.java index 863a7681437d..9d427c416c4e 100644 --- a/platform/core-impl/src/com/intellij/diagnostic/PerformanceWatcher.java +++ b/platform/core-impl/src/com/intellij/diagnostic/PerformanceWatcher.java @@ -59,6 +59,7 @@ public final class PerformanceWatcher implements Disposable { private volatile long myLastSampling = System.currentTimeMillis(); private long myLastDumpTime; private long myFreezeStart; + private int myActiveEvents; private boolean myFreezeDuringStartup; private final AtomicInteger myEdtRequestsQueued = new AtomicInteger(0); @@ -305,13 +306,26 @@ public final class PerformanceWatcher implements Disposable { } public void edtEventStarted(long start) { + myActiveEvents++; if (PRECISE_MODE) { - edtEventFinished(); // finish previous event if any, this way we handle nested event dispatchers - myCurrentEDTEventChecker = new FreezeCheckerTask(start); + finishTracking(); + startTracking(start); } } public void edtEventFinished() { + myActiveEvents--; + finishTracking(); + if (PRECISE_MODE && myActiveEvents > 0) { + startTracking(System.currentTimeMillis()); + } + } + + private void startTracking(long start) { + myCurrentEDTEventChecker = new FreezeCheckerTask(start); + } + + private void finishTracking() { FreezeCheckerTask currentChecker = myCurrentEDTEventChecker; if (currentChecker != null) { currentChecker.stop();