From 8de2b06be827e343a753338bc621e903aa42ce3b Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Thu, 26 Jun 2014 14:31:09 +0400 Subject: [PATCH] avoid hang on init breakpoints during remote debugging --- .../debugger/engine/DebugProcessEvents.java | 12 +++++++ .../engine/JavaBreakpointHandler.java | 4 +-- .../engine/requests/RequestManagerImpl.java | 36 ------------------- 3 files changed, 14 insertions(+), 38 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java index a730883fe1b0..24f5963b4adf 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java @@ -40,6 +40,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Pair; +import com.intellij.xdebugger.XDebugSession; import com.intellij.xdebugger.impl.XDebugSessionImpl; import com.sun.jdi.InternalException; import com.sun.jdi.ThreadReference; @@ -319,6 +320,17 @@ public class DebugProcessEvents extends DebugProcessImpl { myDebugProcessDispatcher.getMulticaster().processAttached(this); + // breakpoints should be initialized after all processAttached listeners work + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + XDebugSession session = getSession().getXDebugSession(); + if (session != null) { + session.initBreakpoints(); + } + } + }); + final String addressDisplayName = DebuggerBundle.getAddressDisplayName(getConnection()); final String transportName = DebuggerBundle.getTransportName(getConnection()); showStatusText(DebuggerBundle.message("status.connected", addressDisplayName, transportName)); diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaBreakpointHandler.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaBreakpointHandler.java index 1050c99a34b1..cf4c46fc3d5f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaBreakpointHandler.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaBreakpointHandler.java @@ -49,7 +49,7 @@ public class JavaBreakpointHandler extends XBreakpointHandler { if (javaBreakpoint != null) { final Breakpoint bpt = javaBreakpoint; BreakpointManager.addBreakpoint(bpt); - myProcess.getManagerThread().invoke(new DebuggerCommandImpl() { + myProcess.getManagerThread().schedule(new DebuggerCommandImpl() { @Override protected void action() throws Exception { bpt.createRequest(myProcess); @@ -62,7 +62,7 @@ public class JavaBreakpointHandler extends XBreakpointHandler { public void unregisterBreakpoint(@NotNull final XBreakpoint breakpoint, boolean temporary) { final Breakpoint javaBreakpoint = BreakpointManager.getJavaBreakpoint(breakpoint); if (javaBreakpoint != null) { - myProcess.getManagerThread().invoke(new DebuggerCommandImpl() { + myProcess.getManagerThread().schedule(new DebuggerCommandImpl() { @Override protected void action() throws Exception { javaBreakpoint.delete(); diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/requests/RequestManagerImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/requests/RequestManagerImpl.java index c404aef4004c..58296e2b7273 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/requests/RequestManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/requests/RequestManagerImpl.java @@ -392,42 +392,6 @@ public class RequestManagerImpl extends DebugProcessAdapterImpl implements Reque public void processAttached(DebugProcessImpl process) { myEventRequestManager = myDebugProcess.getVirtualMachineProxy().eventRequestManager(); - // invoke later, so that requests are for sure created only _after_ 'processAttached()' methods of other listeners are executed - process.getManagerThread().schedule(new DebuggerCommandImpl() { - protected void action() throws Exception { - ApplicationManager.getApplication().runReadAction(new Runnable() { - @Override - public void run() { - XDebugSession session = myDebugProcess.getSession().getXDebugSession(); - if (session != null) { - session.initBreakpoints(); - } - } - }); - //Project project = myDebugProcess.getProject(); - //final BreakpointManager breakpointManager = DebuggerManagerEx.getInstanceEx(project).getBreakpointManager(); - //for (final Breakpoint breakpoint : breakpointManager.getBreakpoints()) { - // try { - // breakpoint.createRequest(myDebugProcess); - // } catch (Exception e) { - // LOG.error(e); - // } - //} - - //AccessToken token = ReadAction.start(); - //try { - // JavaBreakpointAdapter adapter = new JavaBreakpointAdapter(project); - // for (XLineBreakpoint breakpoint : XDebuggerManager.getInstance(project).getBreakpointManager() - // .getBreakpoints(JavaLineBreakpointType.class)) { - // //new JavaLineBreakpointRequestor(breakpoint).createRequest(myDebugProcess); - // //adapter.getOrCreate(breakpoint).createRequest(myDebugProcess); - // } - //} - //finally { - // token.finish(); - //} - } - }); } public void processClassPrepared(final ClassPrepareEvent event) {