Skip to content

Commit 4285736

Browse files
committed
debug: support canceling requests
fixes microsoft#80374
1 parent f6df256 commit 4285736

5 files changed

Lines changed: 29 additions & 12 deletions

File tree

src/vs/workbench/api/browser/mainThreadDebugService.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,6 @@ class ExtensionHostDebugAdapter extends AbstractDebugAdapter {
378378
}
379379

380380
public stopSession(): Promise<void> {
381-
this.cancelPending();
382381
return Promise.resolve(this._proxy.$stopDASession(this._handle));
383382
}
384383
}

src/vs/workbench/contrib/debug/browser/rawDebugSession.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ export class RawDebugSession implements IDisposable {
112112
}
113113
}));
114114

115+
this.toDispose.push(this.onDidContinued(() => this.cancelPendingRequests()));
116+
115117
this.debugAdapter.onEvent(event => {
116118
switch (event.event) {
117119
case 'initialized':
@@ -466,13 +468,16 @@ export class RawDebugSession implements IDisposable {
466468
return Promise.reject(new Error('goto is not supported'));
467469
}
468470

471+
cancel(args: DebugProtocol.CancelArguments): Promise<DebugProtocol.CancelResponse> {
472+
return this.send('cancel', args);
473+
}
474+
469475
custom(request: string, args: any): Promise<DebugProtocol.Response> {
470476
return this.send(request, args);
471477
}
472478

473479
//---- private
474480

475-
476481
private shutdown(error?: Error, restart = false): Promise<any> {
477482
if (!this.inShutdown) {
478483
this.inShutdown = true;
@@ -489,10 +494,23 @@ export class RawDebugSession implements IDisposable {
489494
return Promise.resolve(undefined);
490495
}
491496

497+
private cancelPendingRequests(): void {
498+
if (this.debugAdapter) {
499+
if (this.capabilities.supportsCancelRequest) {
500+
this.debugAdapter.getPendingRequestIds().forEach(requestId => {
501+
this.cancel({ requestId });
502+
});
503+
} else {
504+
this.debugAdapter.cancelPendingRequests();
505+
}
506+
}
507+
}
508+
492509
private stopAdapter(error?: Error): Promise<any> {
493510
if (this.debugAdapter) {
494511
const da = this.debugAdapter;
495512
this.debugAdapter = null;
513+
this.cancelPendingRequests();
496514
return da.stopSession().then(_ => {
497515
this.debugAdapterStopped = true;
498516
this.fireAdapterExitEvent(error);

src/vs/workbench/contrib/debug/common/abstractDebugAdapter.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,10 @@ export abstract class AbstractDebugAdapter implements IDebugAdapter {
137137
this.sendMessage(message);
138138
}
139139

140-
async cancelPending(): Promise<void> {
140+
async cancelPendingRequests(): Promise<void> {
141141
const pending = new Map<number, (e: DebugProtocol.Response) => void>();
142142
this.pendingRequests.forEach((value, key) => pending.set(key, value));
143-
this.pendingRequests.clear();
144-
await timeout(1000);
143+
await timeout(500);
145144
pending.forEach((callback, request_seq) => {
146145
const err: DebugProtocol.Response = {
147146
type: 'response',
@@ -152,10 +151,15 @@ export abstract class AbstractDebugAdapter implements IDebugAdapter {
152151
message: 'canceled'
153152
};
154153
callback(err);
154+
this.pendingRequests.delete(request_seq);
155155
});
156156
}
157157

158+
getPendingRequestIds(): number[] {
159+
return Array.from(this.pendingRequests.keys());
160+
}
161+
158162
dispose(): void {
159-
this.cancelPending();
163+
// noop
160164
}
161165
}

src/vs/workbench/contrib/debug/common/debug.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,8 @@ export interface IDebugAdapter extends IDisposable {
506506
sendResponse(response: DebugProtocol.Response): void;
507507
sendRequest(command: string, args: any, clb: (result: DebugProtocol.Response) => void, timeout?: number): void;
508508
stopSession(): Promise<void>;
509+
cancelPendingRequests(): void;
510+
getPendingRequestIds(): number[];
509511
}
510512

511513
export interface IDebugAdapterFactory extends ITerminalLauncher {

src/vs/workbench/contrib/debug/node/debugAdapter.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,6 @@ export class SocketDebugAdapter extends StreamDebugAdapter {
129129

130130
stopSession(): Promise<void> {
131131

132-
// Cancel all sent promises on disconnect so debug trees are not left in a broken state #3666.
133-
this.cancelPending();
134-
135132
if (this.socket) {
136133
this.socket.end();
137134
this.socket = undefined;
@@ -254,9 +251,6 @@ export class ExecutableDebugAdapter extends StreamDebugAdapter {
254251

255252
stopSession(): Promise<void> {
256253

257-
// Cancel all sent promises on disconnect so debug trees are not left in a broken state #3666.
258-
this.cancelPending();
259-
260254
if (!this.serverProcess) {
261255
return Promise.resolve(undefined);
262256
}

0 commit comments

Comments
 (0)