Skip to content

Commit 46828dc

Browse files
authored
Spawn a process directly for noDebug mode. (#207)
* Spawn a process directly for noDebug mode. * Support to run without debugging in terminal. * Add isDebugMode interface for frequently used logic. * Revert "Add isDebugMode interface for frequently used logic." This reverts commit 1d2a27f. * Refactor: use separate LaunchRequest handlers for debug/noDebug mode * Handle DisconnectRequest for noDebug mode * Register all handlers, let handler decide what to do. * fix typo. * Improve code readability. * Refactor: Use a common launch request handler for both debug/NoDebug mode * Delay the construction time of active launch handler instance. * Rename classes to avoid confusion.
1 parent f093f8b commit 46828dc

File tree

8 files changed

+579
-255
lines changed

8 files changed

+579
-255
lines changed

com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/DebugAdapter.java

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.microsoft.java.debug.core.adapter.handler.CompletionsHandler;
2525
import com.microsoft.java.debug.core.adapter.handler.ConfigurationDoneRequestHandler;
2626
import com.microsoft.java.debug.core.adapter.handler.DisconnectRequestHandler;
27+
import com.microsoft.java.debug.core.adapter.handler.DisconnectRequestWithoutDebuggingHandler;
2728
import com.microsoft.java.debug.core.adapter.handler.EvaluateRequestHandler;
2829
import com.microsoft.java.debug.core.adapter.handler.HotCodeReplaceHandler;
2930
import com.microsoft.java.debug.core.adapter.handler.InitializeRequestHandler;
@@ -95,37 +96,43 @@ public CompletableFuture<Messages.Response> dispatchRequest(Messages.Request req
9596
private void initialize() {
9697
// Register request handlers.
9798
// When there are multiple handlers registered for the same request, follow the rule "first register, first execute".
98-
registerHandler(new InitializeRequestHandler(), true, true);
99-
registerHandler(new LaunchRequestHandler(), true, true);
100-
registerHandler(new AttachRequestHandler());
101-
registerHandler(new ConfigurationDoneRequestHandler(), true, true);
102-
registerHandler(new DisconnectRequestHandler(), true, true);
103-
registerHandler(new SetBreakpointsRequestHandler());
104-
registerHandler(new SetExceptionBreakpointsRequestHandler());
105-
registerHandler(new SourceRequestHandler());
106-
registerHandler(new ThreadsRequestHandler());
107-
registerHandler(new StepRequestHandler());
108-
registerHandler(new StackTraceRequestHandler());
109-
registerHandler(new ScopesRequestHandler());
110-
registerHandler(new VariablesRequestHandler());
111-
registerHandler(new SetVariableRequestHandler());
112-
registerHandler(new EvaluateRequestHandler());
113-
registerHandler(new HotCodeReplaceHandler());
114-
registerHandler(new RestartFrameHandler());
115-
registerHandler(new CompletionsHandler());
99+
registerHandler(new InitializeRequestHandler());
100+
registerHandler(new LaunchRequestHandler());
101+
102+
// DEBUG node only
103+
registerHandlerForDebug(new AttachRequestHandler());
104+
registerHandlerForDebug(new ConfigurationDoneRequestHandler());
105+
registerHandlerForDebug(new DisconnectRequestHandler());
106+
registerHandlerForDebug(new SetBreakpointsRequestHandler());
107+
registerHandlerForDebug(new SetExceptionBreakpointsRequestHandler());
108+
registerHandlerForDebug(new SourceRequestHandler());
109+
registerHandlerForDebug(new ThreadsRequestHandler());
110+
registerHandlerForDebug(new StepRequestHandler());
111+
registerHandlerForDebug(new StackTraceRequestHandler());
112+
registerHandlerForDebug(new ScopesRequestHandler());
113+
registerHandlerForDebug(new VariablesRequestHandler());
114+
registerHandlerForDebug(new SetVariableRequestHandler());
115+
registerHandlerForDebug(new EvaluateRequestHandler());
116+
registerHandlerForDebug(new HotCodeReplaceHandler());
117+
registerHandlerForDebug(new RestartFrameHandler());
118+
registerHandlerForDebug(new CompletionsHandler());
119+
120+
// NO_DEBUG mode only
121+
registerHandlerForNoDebug(new DisconnectRequestWithoutDebuggingHandler());
122+
116123
}
117124

118-
private void registerHandler(IDebugRequestHandler handler) {
119-
registerHandler(handler, true, false);
125+
private void registerHandlerForDebug(IDebugRequestHandler handler) {
126+
registerHandler(requestHandlersForDebug, handler);
120127
}
121128

122-
private void registerHandler(IDebugRequestHandler handler, boolean forDebug, boolean forNoDebug) {
123-
if (forDebug) {
124-
registerHandler(requestHandlersForDebug, handler);
125-
}
126-
if (forNoDebug) {
127-
registerHandler(requestHandlersForNoDebug, handler);
128-
}
129+
private void registerHandlerForNoDebug(IDebugRequestHandler handler) {
130+
registerHandler(requestHandlersForNoDebug, handler);
131+
}
132+
133+
private void registerHandler(IDebugRequestHandler handler) {
134+
registerHandler(requestHandlersForDebug, handler);
135+
registerHandler(requestHandlersForNoDebug, handler);
129136
}
130137

131138
private void registerHandler(Map<Command, List<IDebugRequestHandler>> requestHandlers, IDebugRequestHandler handler) {

com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/DebugAdapterContext.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public class DebugAdapterContext implements IDebugAdapterContext {
3939
private transient boolean vmTerminated;
4040
private boolean isVmStopOnEntry = false;
4141
private LaunchMode launchMode = LaunchMode.DEBUG;
42+
private Process debuggeeProcess;
4243
private String mainClass;
4344
private StepFilters stepFilters;
4445

@@ -242,4 +243,14 @@ public LaunchMode getLaunchMode() {
242243
public void setLaunchMode(LaunchMode launchMode) {
243244
this.launchMode = launchMode;
244245
}
246+
247+
@Override
248+
public Process getDebuggeeProcess() {
249+
return this.debuggeeProcess;
250+
}
251+
252+
@Override
253+
public void setDebuggeeProcess(Process debuggeeProcess) {
254+
this.debuggeeProcess = debuggeeProcess;
255+
}
245256
}

com.microsoft.java.debug.core/src/main/java/com/microsoft/java/debug/core/adapter/IDebugAdapterContext.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,8 @@ public interface IDebugAdapterContext {
105105
LaunchMode getLaunchMode();
106106

107107
void setLaunchMode(LaunchMode launchMode);
108+
109+
Process getDebuggeeProcess();
110+
111+
void setDebuggeeProcess(Process debuggeeProcess);
108112
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2018 Microsoft Corporation and others.
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v1.0
5+
* which accompanies this distribution, and is available at
6+
* http://www.eclipse.org/legal/epl-v10.html
7+
*
8+
* Contributors:
9+
* Microsoft Corporation - initial API and implementation
10+
*******************************************************************************/
11+
12+
package com.microsoft.java.debug.core.adapter.handler;
13+
14+
import java.util.Arrays;
15+
import java.util.List;
16+
import java.util.concurrent.CompletableFuture;
17+
18+
import com.microsoft.java.debug.core.adapter.IDebugAdapterContext;
19+
import com.microsoft.java.debug.core.adapter.IDebugRequestHandler;
20+
import com.microsoft.java.debug.core.protocol.Messages.Response;
21+
import com.microsoft.java.debug.core.protocol.Requests.Arguments;
22+
import com.microsoft.java.debug.core.protocol.Requests.Command;
23+
import com.microsoft.java.debug.core.protocol.Requests.DisconnectArguments;
24+
25+
public class DisconnectRequestWithoutDebuggingHandler implements IDebugRequestHandler {
26+
27+
@Override
28+
public List<Command> getTargetCommands() {
29+
return Arrays.asList(Command.DISCONNECT);
30+
}
31+
32+
@Override
33+
public CompletableFuture<Response> handle(Command command, Arguments arguments, Response response, IDebugAdapterContext context) {
34+
DisconnectArguments disconnectArguments = (DisconnectArguments) arguments;
35+
Process debuggeeProcess = context.getDebuggeeProcess();
36+
if (debuggeeProcess != null && disconnectArguments.terminateDebuggee) {
37+
debuggeeProcess.destroy();
38+
}
39+
return CompletableFuture.completedFuture(response);
40+
}
41+
42+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2018 Microsoft Corporation and others.
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v1.0
5+
* which accompanies this distribution, and is available at
6+
* http://www.eclipse.org/legal/epl-v10.html
7+
*
8+
* Contributors:
9+
* Microsoft Corporation - initial API and implementation
10+
*******************************************************************************/
11+
12+
package com.microsoft.java.debug.core.adapter.handler;
13+
14+
import java.util.concurrent.CompletableFuture;
15+
16+
import com.microsoft.java.debug.core.adapter.IDebugAdapterContext;
17+
import com.microsoft.java.debug.core.protocol.Messages.Response;
18+
import com.microsoft.java.debug.core.protocol.Requests.LaunchArguments;
19+
20+
public interface ILaunchDelegate {
21+
void postLaunch(LaunchArguments launchArguments, IDebugAdapterContext context);
22+
23+
void preLaunch(LaunchArguments launchArguments, IDebugAdapterContext context);
24+
25+
CompletableFuture<Response> launchInTerminal(LaunchArguments launchArguments, Response response, IDebugAdapterContext context);
26+
27+
CompletableFuture<Response> launchInternally(LaunchArguments launchArguments, Response response, IDebugAdapterContext context);
28+
29+
}

0 commit comments

Comments
 (0)