未验证 提交 861a1c21 编写于 作者: D Daniel Imms 提交者: GitHub

Merge pull request #74896 from microsoft/alexr00/terminalExitRace

Terminal race between process exit and on ready listeners
......@@ -535,7 +535,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape {
// Fork the process and listen for messages
this._logService.debug(`Terminal process launching on ext host`, shellLaunchConfig, initialCwd, cols, rows, env);
const p = new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, terminalConfig.get('windowsEnableConpty') as boolean, this._logService);
p.onProcessIdReady(pid => this._proxy.$sendProcessPid(id, pid));
p.onProcessReady((e: { pid: number, cwd: string }) => this._proxy.$sendProcessPid(id, e.pid));
p.onProcessTitleChanged(title => this._proxy.$sendProcessTitle(id, title));
p.onProcessData(data => this._proxy.$sendProcessData(id, data));
p.onProcessExit(exitCode => this._onProcessExit(id, exitCode));
......
......@@ -50,6 +50,7 @@ export class TerminalProcessManager implements ITerminalProcessManager {
private _latency: number = -1;
private _latencyRequest: Promise<number>;
private _latencyLastMeasured: number = 0;
private _initialCwd: string;
private readonly _onProcessReady = new Emitter<void>();
public get onProcessReady(): Event<void> { return this._onProcessReady.event; }
......@@ -138,8 +139,9 @@ export class TerminalProcessManager implements ITerminalProcessManager {
}
});
this._process.onProcessIdReady(pid => {
this.shellProcessId = pid;
this._process.onProcessReady((e: { pid: number, cwd: string }) => {
this.shellProcessId = e.pid;
this._initialCwd = e.cwd;
this._onProcessReady.fire();
// Send any queued data that's waiting
......@@ -207,10 +209,7 @@ export class TerminalProcessManager implements ITerminalProcessManager {
}
public getInitialCwd(): Promise<string> {
if (!this._process) {
return Promise.resolve('');
}
return this._process.getInitialCwd();
return Promise.resolve(this._initialCwd);
}
public getCwd(): Promise<string> {
......
......@@ -763,7 +763,7 @@ export interface IWindowsShellHelper extends IDisposable {
export interface ITerminalChildProcess {
onProcessData: Event<string>;
onProcessExit: Event<number>;
onProcessIdReady: Event<number>;
onProcessReady: Event<{ pid: number, cwd: string }>;
onProcessTitleChanged: Event<string>;
/**
......
......@@ -18,8 +18,8 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal
public readonly onProcessData: Event<string> = this._onProcessData.event;
private readonly _onProcessExit = this._register(new Emitter<number>());
public readonly onProcessExit: Event<number> = this._onProcessExit.event;
private readonly _onProcessIdReady = this._register(new Emitter<number>());
public readonly onProcessIdReady: Event<number> = this._onProcessIdReady.event;
private readonly _onProcessReady = new Emitter<{ pid: number, cwd: string }>();
public get onProcessReady(): Event<{ pid: number, cwd: string }> { return this._onProcessReady.event; }
private readonly _onProcessTitleChanged = this._register(new Emitter<string>());
public readonly onProcessTitleChanged: Event<string> = this._onProcessTitleChanged.event;
......@@ -72,7 +72,7 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal
}
public emitPid(pid: number): void {
this._onProcessIdReady.fire(pid);
this._onProcessReady.fire({ pid, cwd: '' });
}
public emitExit(exitCode: number): void {
......
......@@ -29,8 +29,8 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable {
public get onProcessData(): Event<string> { return this._onProcessData.event; }
private readonly _onProcessExit = new Emitter<number>();
public get onProcessExit(): Event<number> { return this._onProcessExit.event; }
private readonly _onProcessIdReady = new Emitter<number>();
public get onProcessIdReady(): Event<number> { return this._onProcessIdReady.event; }
private readonly _onProcessReady = new Emitter<{ pid: number, cwd: string }>();
public get onProcessReady(): Event<{ pid: number, cwd: string }> { return this._onProcessReady.event; }
private readonly _onProcessTitleChanged = new Emitter<string>();
public get onProcessTitleChanged(): Event<string> { return this._onProcessTitleChanged.event; }
......@@ -83,7 +83,7 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable {
const ptyProcess = pty.spawn(shellLaunchConfig.executable!, args, options);
this._ptyProcess = ptyProcess;
this._processStartupComplete = new Promise<void>(c => {
this.onProcessIdReady(() => c());
this.onProcessReady(() => c());
});
ptyProcess.on('data', data => {
this._onProcessData.fire(data);
......@@ -111,7 +111,7 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable {
this._titleInterval = null;
this._onProcessData.dispose();
this._onProcessExit.dispose();
this._onProcessIdReady.dispose();
this._onProcessReady.dispose();
this._onProcessTitleChanged.dispose();
}
......@@ -162,7 +162,7 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable {
}
private _sendProcessId(ptyProcess: pty.IPty) {
this._onProcessIdReady.fire(ptyProcess.pid);
this._onProcessReady.fire({ pid: ptyProcess.pid, cwd: this._initialCwd });
}
private _sendProcessTitle(ptyProcess: pty.IPty): void {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册