Skip to content

Commit

Permalink
debug: use cancellation tokens for stackTrace aslo
Browse files Browse the repository at this point in the history
fixes #103611
  • Loading branch information
isidorn committed Aug 12, 2020
1 parent 1b0d4db commit e3a0f6a
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 14 deletions.
15 changes: 8 additions & 7 deletions src/vs/workbench/contrib/debug/browser/debugSession.ts
Expand Up @@ -448,13 +448,13 @@ export class DebugSession implements IDebugSession {
return this.raw.custom(request, args);
}

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

const token = this.getNewCancellationToken(threadId);
return this.raw.stackTrace({ threadId, startFrame, levels }, token);
const sessionToken = this.getNewCancellationToken(threadId, token);
return this.raw.stackTrace({ threadId, startFrame, levels }, sessionToken);
}

async exceptionInfo(threadId: number): Promise<IExceptionInfo | undefined> {
Expand Down Expand Up @@ -628,17 +628,18 @@ export class DebugSession implements IDebugSession {
}
}

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

return this.raw.completions({
frameId,
text,
column: position.column,
line: position.lineNumber,
}, token);
}, sessionCancelationToken);
}

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

private getNewCancellationToken(threadId: number): CancellationToken {
const tokenSource = new CancellationTokenSource();
private getNewCancellationToken(threadId: number, token?: CancellationToken): CancellationToken {
const tokenSource = new CancellationTokenSource(token);
const tokens = this.cancellationMap.get(threadId) || [];
tokens.push(tokenSource);
this.cancellationMap.set(threadId, tokens);
Expand Down
2 changes: 1 addition & 1 deletion src/vs/workbench/contrib/debug/browser/repl.ts
Expand Up @@ -141,7 +141,7 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
const text = model.getValue();
const focusedStackFrame = this.debugService.getViewModel().focusedStackFrame;
const frameId = focusedStackFrame ? focusedStackFrame.frameId : undefined;
const response = await session.completions(frameId, text, position, overwriteBefore, token);
const response = await session.completions(frameId, focusedStackFrame?.thread.threadId || 0, text, position, overwriteBefore, token);

const suggestions: CompletionItem[] = [];
const computeRange = (length: number) => Range.fromPositions(position.delta(0, -length), position);
Expand Down
4 changes: 2 additions & 2 deletions src/vs/workbench/contrib/debug/common/debug.ts
Expand Up @@ -225,7 +225,7 @@ export interface IDebugSession extends ITreeElement {
sendExceptionBreakpoints(exbpts: IExceptionBreakpoint[]): Promise<void>;
breakpointsLocations(uri: uri, lineNumber: number): Promise<IPosition[]>;

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

stepInTargets(frameId: number): Promise<{ id: number, label: string }[]>;
completions(frameId: number | undefined, text: string, position: Position, overwriteBefore: number, token: CancellationToken): Promise<DebugProtocol.CompletionsResponse>;
completions(frameId: number | undefined, threadId: number, text: string, position: Position, overwriteBefore: number, token: CancellationToken): Promise<DebugProtocol.CompletionsResponse>;
setVariable(variablesReference: number | undefined, name: string, value: string): Promise<DebugProtocol.SetVariableResponse>;
loadSource(resource: uri): Promise<DebugProtocol.SourceResponse>;
getLoadedSources(): Promise<Source[]>;
Expand Down
10 changes: 8 additions & 2 deletions src/vs/workbench/contrib/debug/common/debugModel.ts
Expand Up @@ -22,6 +22,7 @@ import { ITextFileService } from 'vs/workbench/services/textfile/common/textfile
import { ITextEditorPane } from 'vs/workbench/common/editor';
import { mixin } from 'vs/base/common/objects';
import { DebugStorage } from 'vs/workbench/contrib/debug/common/debugStorage';
import { CancellationTokenSource } from 'vs/base/common/cancellation';

export class ExpressionContainer implements IExpressionContainer {

Expand Down Expand Up @@ -366,6 +367,7 @@ export class StackFrame implements IStackFrame {
export class Thread implements IThread {
private callStack: IStackFrame[];
private staleCallStack: IStackFrame[];
private callStackCancellationTokens: CancellationTokenSource[] = [];
public stoppedDetails: IRawStoppedDetails | undefined;
public stopped: boolean;

Expand All @@ -384,6 +386,8 @@ export class Thread implements IThread {
this.staleCallStack = this.callStack;
}
this.callStack = [];
this.callStackCancellationTokens.forEach(c => c.dispose(true));
this.callStackCancellationTokens = [];
}

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

private async getCallStackImpl(startFrame: number, levels: number): Promise<IStackFrame[]> {
try {
const response = await this.session.stackTrace(this.threadId, startFrame, levels);
if (!response || !response.body) {
const tokenSource = new CancellationTokenSource();
this.callStackCancellationTokens.push(tokenSource);
const response = await this.session.stackTrace(this.threadId, startFrame, levels, tokenSource.token);
if (!response || !response.body || tokenSource.token.isCancellationRequested) {
return [];
}

Expand Down
5 changes: 3 additions & 2 deletions src/vs/workbench/contrib/debug/test/common/mockDebug.ts
Expand Up @@ -14,6 +14,7 @@ import { AbstractDebugAdapter } from 'vs/workbench/contrib/debug/common/abstract
import { DebugStorage } from 'vs/workbench/contrib/debug/common/debugStorage';
import { ExceptionBreakpoint, Expression, DataBreakpoint, FunctionBreakpoint, Breakpoint, DebugModel } from 'vs/workbench/contrib/debug/common/debugModel';
import { DebugCompoundRoot } from 'vs/workbench/contrib/debug/common/debugCompoundRoot';
import { CancellationToken } from 'vs/base/common/cancellation';

export class MockDebugService implements IDebugService {

Expand Down Expand Up @@ -266,7 +267,7 @@ export class MockSession implements IDebugSession {
return Promise.resolve([]);
}

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

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

0 comments on commit e3a0f6a

Please sign in to comment.