Skip to content

Commit e3a0f6a

Browse files
committed
debug: use cancellation tokens for stackTrace aslo
fixes microsoft#103611
1 parent 1b0d4db commit e3a0f6a

5 files changed

Lines changed: 22 additions & 14 deletions

File tree

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -448,13 +448,13 @@ export class DebugSession implements IDebugSession {
448448
return this.raw.custom(request, args);
449449
}
450450

451-
stackTrace(threadId: number, startFrame: number, levels: number): Promise<DebugProtocol.StackTraceResponse> {
451+
stackTrace(threadId: number, startFrame: number, levels: number, token: CancellationToken): Promise<DebugProtocol.StackTraceResponse> {
452452
if (!this.raw) {
453453
throw new Error(localize('noDebugAdapter', "No debug adapter, can not send '{0}'", 'stackTrace'));
454454
}
455455

456-
const token = this.getNewCancellationToken(threadId);
457-
return this.raw.stackTrace({ threadId, startFrame, levels }, token);
456+
const sessionToken = this.getNewCancellationToken(threadId, token);
457+
return this.raw.stackTrace({ threadId, startFrame, levels }, sessionToken);
458458
}
459459

460460
async exceptionInfo(threadId: number): Promise<IExceptionInfo | undefined> {
@@ -628,17 +628,18 @@ export class DebugSession implements IDebugSession {
628628
}
629629
}
630630

631-
async completions(frameId: number | undefined, text: string, position: Position, overwriteBefore: number, token: CancellationToken): Promise<DebugProtocol.CompletionsResponse> {
631+
async completions(frameId: number | undefined, threadId: number, text: string, position: Position, overwriteBefore: number, token: CancellationToken): Promise<DebugProtocol.CompletionsResponse> {
632632
if (!this.raw) {
633633
return Promise.reject(new Error(localize('noDebugAdapter', "No debug adapter, can not send '{0}'", 'completions')));
634634
}
635+
const sessionCancelationToken = this.getNewCancellationToken(threadId, token);
635636

636637
return this.raw.completions({
637638
frameId,
638639
text,
639640
column: position.column,
640641
line: position.lineNumber,
641-
}, token);
642+
}, sessionCancelationToken);
642643
}
643644

644645
async stepInTargets(frameId: number): Promise<{ id: number, label: string }[]> {
@@ -1053,8 +1054,8 @@ export class DebugSession implements IDebugSession {
10531054
}
10541055
}
10551056

1056-
private getNewCancellationToken(threadId: number): CancellationToken {
1057-
const tokenSource = new CancellationTokenSource();
1057+
private getNewCancellationToken(threadId: number, token?: CancellationToken): CancellationToken {
1058+
const tokenSource = new CancellationTokenSource(token);
10581059
const tokens = this.cancellationMap.get(threadId) || [];
10591060
tokens.push(tokenSource);
10601061
this.cancellationMap.set(threadId, tokens);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
141141
const text = model.getValue();
142142
const focusedStackFrame = this.debugService.getViewModel().focusedStackFrame;
143143
const frameId = focusedStackFrame ? focusedStackFrame.frameId : undefined;
144-
const response = await session.completions(frameId, text, position, overwriteBefore, token);
144+
const response = await session.completions(frameId, focusedStackFrame?.thread.threadId || 0, text, position, overwriteBefore, token);
145145

146146
const suggestions: CompletionItem[] = [];
147147
const computeRange = (length: number) => Range.fromPositions(position.delta(0, -length), position);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ export interface IDebugSession extends ITreeElement {
225225
sendExceptionBreakpoints(exbpts: IExceptionBreakpoint[]): Promise<void>;
226226
breakpointsLocations(uri: uri, lineNumber: number): Promise<IPosition[]>;
227227

228-
stackTrace(threadId: number, startFrame: number, levels: number): Promise<DebugProtocol.StackTraceResponse>;
228+
stackTrace(threadId: number, startFrame: number, levels: number, token: CancellationToken): Promise<DebugProtocol.StackTraceResponse>;
229229
exceptionInfo(threadId: number): Promise<IExceptionInfo | undefined>;
230230
scopes(frameId: number, threadId: number): Promise<DebugProtocol.ScopesResponse>;
231231
variables(variablesReference: number, threadId: number | undefined, filter: 'indexed' | 'named' | undefined, start: number | undefined, count: number | undefined): Promise<DebugProtocol.VariablesResponse>;
@@ -244,7 +244,7 @@ export interface IDebugSession extends ITreeElement {
244244
terminateThreads(threadIds: number[]): Promise<void>;
245245

246246
stepInTargets(frameId: number): Promise<{ id: number, label: string }[]>;
247-
completions(frameId: number | undefined, text: string, position: Position, overwriteBefore: number, token: CancellationToken): Promise<DebugProtocol.CompletionsResponse>;
247+
completions(frameId: number | undefined, threadId: number, text: string, position: Position, overwriteBefore: number, token: CancellationToken): Promise<DebugProtocol.CompletionsResponse>;
248248
setVariable(variablesReference: number | undefined, name: string, value: string): Promise<DebugProtocol.SetVariableResponse>;
249249
loadSource(resource: uri): Promise<DebugProtocol.SourceResponse>;
250250
getLoadedSources(): Promise<Source[]>;

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { ITextFileService } from 'vs/workbench/services/textfile/common/textfile
2222
import { ITextEditorPane } from 'vs/workbench/common/editor';
2323
import { mixin } from 'vs/base/common/objects';
2424
import { DebugStorage } from 'vs/workbench/contrib/debug/common/debugStorage';
25+
import { CancellationTokenSource } from 'vs/base/common/cancellation';
2526

2627
export class ExpressionContainer implements IExpressionContainer {
2728

@@ -366,6 +367,7 @@ export class StackFrame implements IStackFrame {
366367
export class Thread implements IThread {
367368
private callStack: IStackFrame[];
368369
private staleCallStack: IStackFrame[];
370+
private callStackCancellationTokens: CancellationTokenSource[] = [];
369371
public stoppedDetails: IRawStoppedDetails | undefined;
370372
public stopped: boolean;
371373

@@ -384,6 +386,8 @@ export class Thread implements IThread {
384386
this.staleCallStack = this.callStack;
385387
}
386388
this.callStack = [];
389+
this.callStackCancellationTokens.forEach(c => c.dispose(true));
390+
this.callStackCancellationTokens = [];
387391
}
388392

389393
getCallStack(): IStackFrame[] {
@@ -424,8 +428,10 @@ export class Thread implements IThread {
424428

425429
private async getCallStackImpl(startFrame: number, levels: number): Promise<IStackFrame[]> {
426430
try {
427-
const response = await this.session.stackTrace(this.threadId, startFrame, levels);
428-
if (!response || !response.body) {
431+
const tokenSource = new CancellationTokenSource();
432+
this.callStackCancellationTokens.push(tokenSource);
433+
const response = await this.session.stackTrace(this.threadId, startFrame, levels, tokenSource.token);
434+
if (!response || !response.body || tokenSource.token.isCancellationRequested) {
429435
return [];
430436
}
431437

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { AbstractDebugAdapter } from 'vs/workbench/contrib/debug/common/abstract
1414
import { DebugStorage } from 'vs/workbench/contrib/debug/common/debugStorage';
1515
import { ExceptionBreakpoint, Expression, DataBreakpoint, FunctionBreakpoint, Breakpoint, DebugModel } from 'vs/workbench/contrib/debug/common/debugModel';
1616
import { DebugCompoundRoot } from 'vs/workbench/contrib/debug/common/debugCompoundRoot';
17+
import { CancellationToken } from 'vs/base/common/cancellation';
1718

1819
export class MockDebugService implements IDebugService {
1920

@@ -266,7 +267,7 @@ export class MockSession implements IDebugSession {
266267
return Promise.resolve([]);
267268
}
268269

269-
completions(frameId: number, text: string, position: Position, overwriteBefore: number): Promise<DebugProtocol.CompletionsResponse> {
270+
completions(frameId: number, threadId: number, text: string, position: Position, overwriteBefore: number): Promise<DebugProtocol.CompletionsResponse> {
270271
throw new Error('not implemented');
271272
}
272273

@@ -295,7 +296,7 @@ export class MockSession implements IDebugSession {
295296
customRequest(request: string, args: any): Promise<DebugProtocol.Response> {
296297
throw new Error('Method not implemented.');
297298
}
298-
stackTrace(threadId: number, startFrame: number, levels: number): Promise<DebugProtocol.StackTraceResponse> {
299+
stackTrace(threadId: number, startFrame: number, levels: number, token: CancellationToken): Promise<DebugProtocol.StackTraceResponse> {
299300
throw new Error('Method not implemented.');
300301
}
301302
exceptionInfo(threadId: number): Promise<IExceptionInfo> {

0 commit comments

Comments
 (0)