From d87c046eadc9c853e4a6e85fdf6872f47a1f5d7e Mon Sep 17 00:00:00 2001 From: "andrey.zaytsev" Date: Wed, 20 Feb 2013 22:21:45 +0400 Subject: [PATCH] IDEA-101456 Throwable at com.intellij.openapi.application.impl.ApplicationImpl.assertWriteAccessAllowed. also remove temporary breakpoint after hit when debug process stops --- .../debugger/ui/breakpoints/Breakpoint.java | 37 +++++++++++++------ .../xdebugger/impl/XDebugSessionImpl.java | 32 ++++++++++------ 2 files changed, 45 insertions(+), 24 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java index 58b1917b57a1..3d694e1dd28f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java @@ -249,21 +249,34 @@ public abstract class Breakpoint extends FilteredRequestor implements ClassPrepa } } if (REMOVE_AFTER_HIT) { - debugProcess.addDebugProcessListener(new DebugProcessAdapter() { - @Override - public void resumed(SuspendContext suspendContext) { - DebuggerUIUtil.invokeOnEventDispatch(new Runnable() { - @Override - public void run() { - DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager().removeBreakpoint(Breakpoint.this); - } - }); - debugProcess.removeDebugProcessListener(this); - } - }); + handleTemporaryBreakpointHit(debugProcess); } } + private void handleTemporaryBreakpointHit(final DebugProcessImpl debugProcess) { + debugProcess.addDebugProcessListener(new DebugProcessAdapter() { + @Override + public void resumed(SuspendContext suspendContext) { + removeBreakpoint(); + } + + @Override + public void processDetached(DebugProcess process, boolean closedByUser) { + removeBreakpoint(); + } + + private void removeBreakpoint() { + DebuggerUIUtil.invokeOnEventDispatch(new Runnable() { + @Override + public void run() { + DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager().removeBreakpoint(Breakpoint.this); + } + }); + debugProcess.removeDebugProcessListener(this); + } + }); + } + public final void updateUI() { updateUI(EmptyRunnable.getInstance()); } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java index 41fab55e3864..4df444162c32 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java @@ -588,22 +588,30 @@ public class XDebugSessionImpl implements XDebugSession { positionReached(suspendContext); if (breakpoint instanceof XLineBreakpoint && ((XLineBreakpoint)breakpoint).isTemporary()) { - addSessionListener(new XDebugSessionAdapter() { - @Override - public void sessionResumed() { - DebuggerUIUtil.invokeOnEventDispatch(new Runnable() { - @Override - public void run() { - XDebuggerManager.getInstance(myProject).getBreakpointManager().removeBreakpoint(breakpoint); - } - }); - removeSessionListener(this); - } - }); + handleTemporaryBreakpointHit(breakpoint); } return true; } + private void handleTemporaryBreakpointHit(final XBreakpoint breakpoint) { + addSessionListener(new XDebugSessionAdapter() { + private void removeBreakpoint() { + XDebuggerUtil.getInstance().removeBreakpoint(myProject, breakpoint); + removeSessionListener(this); + } + + @Override + public void sessionResumed() { + removeBreakpoint(); + } + + @Override + public void sessionStopped() { + removeBreakpoint(); + } + }); + } + private void processDependencies(final XBreakpoint breakpoint) { XDependentBreakpointManager dependentBreakpointManager = myDebuggerManager.getBreakpointManager().getDependentBreakpointManager(); if (!dependentBreakpointManager.isMasterOrSlave(breakpoint)) return;