From 1f1b0e2574367a78f2175f1a9166598d2f6570f2 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Fri, 12 Feb 2016 17:23:08 +0300 Subject: [PATCH] prevent Alarm.checkDisposed assert --- .../debugger/engine/ThreadBlockedMonitor.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/ThreadBlockedMonitor.java b/java/debugger/impl/src/com/intellij/debugger/engine/ThreadBlockedMonitor.java index e36faf363471..2b50d7ce07a4 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/ThreadBlockedMonitor.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/ThreadBlockedMonitor.java @@ -15,6 +15,7 @@ */ package com.intellij.debugger.engine; +import com.intellij.concurrency.JobScheduler; import com.intellij.debugger.DebuggerBundle; import com.intellij.debugger.engine.events.DebuggerCommandImpl; import com.intellij.debugger.engine.jdi.ThreadReferenceProxy; @@ -23,9 +24,8 @@ import com.intellij.debugger.jdi.VirtualMachineProxyImpl; import com.intellij.notification.NotificationType; import com.intellij.openapi.Disposable; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.registry.Registry; -import com.intellij.util.Alarm; -import com.intellij.util.SingleAlarm; import com.intellij.xdebugger.impl.XDebugSessionImpl; import com.sun.jdi.IncompatibleThreadStateException; import com.sun.jdi.ObjectReference; @@ -36,6 +36,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.event.HyperlinkEvent; import java.util.Collection; import java.util.HashSet; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; /** * @author egor @@ -45,12 +47,12 @@ public class ThreadBlockedMonitor { private final Collection myWatchedThreads = new HashSet<>(); - private final SingleAlarm myAlarm; + private ScheduledFuture myTask; private final DebugProcessImpl myProcess; public ThreadBlockedMonitor(DebugProcessImpl process, Disposable disposable) { myProcess = process; - myAlarm = new SingleAlarm(this::checkBlockingThread, 5000, Alarm.ThreadToUse.POOLED_THREAD, disposable); + Disposer.register(disposable, this::cancelTask); } public void startWatching(@Nullable ThreadReferenceProxy thread) { @@ -58,7 +60,9 @@ public class ThreadBlockedMonitor { DebuggerManagerThreadImpl.assertIsManagerThread(); if (thread != null) { myWatchedThreads.add(thread); - myAlarm.request(); + if (myTask == null) { + myTask = JobScheduler.getScheduler().scheduleWithFixedDelay(this::checkBlockingThread, 5, 5, TimeUnit.SECONDS); + } } } @@ -71,7 +75,14 @@ public class ThreadBlockedMonitor { myWatchedThreads.clear(); } if (myWatchedThreads.isEmpty()) { - myAlarm.cancel(); + cancelTask(); + } + } + + private void cancelTask() { + if (myTask != null) { + myTask.cancel(true); + myTask = null; } } @@ -129,7 +140,6 @@ public class ThreadBlockedMonitor { } finally { vmProxy.getVirtualMachine().resume(); - myAlarm.request(); } } });