提交 90d06ab0 编写于 作者: D Daniel Imms

Revert "Revert "Kill processes immediately on shutdown, use SIGTERM""

This reverts commit 1f7ce421.
上级 5c421391
...@@ -199,7 +199,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape ...@@ -199,7 +199,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
this._proxy.$createProcess(request.proxy.terminalId, shellLaunchConfigDto, request.cols, request.rows); this._proxy.$createProcess(request.proxy.terminalId, shellLaunchConfigDto, request.cols, request.rows);
request.proxy.onInput(data => this._proxy.$acceptProcessInput(request.proxy.terminalId, data)); request.proxy.onInput(data => this._proxy.$acceptProcessInput(request.proxy.terminalId, data));
request.proxy.onResize(dimensions => this._proxy.$acceptProcessResize(request.proxy.terminalId, dimensions.cols, dimensions.rows)); request.proxy.onResize(dimensions => this._proxy.$acceptProcessResize(request.proxy.terminalId, dimensions.cols, dimensions.rows));
request.proxy.onShutdown(() => this._proxy.$acceptProcessShutdown(request.proxy.terminalId)); request.proxy.onShutdown(immediate => this._proxy.$acceptProcessShutdown(request.proxy.terminalId, immediate));
} }
public $sendProcessTitle(terminalId: number, title: string): void { public $sendProcessTitle(terminalId: number, title: string): void {
......
...@@ -878,7 +878,7 @@ export interface ExtHostTerminalServiceShape { ...@@ -878,7 +878,7 @@ export interface ExtHostTerminalServiceShape {
$createProcess(id: number, shellLaunchConfig: ShellLaunchConfigDto, cols: number, rows: number): void; $createProcess(id: number, shellLaunchConfig: ShellLaunchConfigDto, cols: number, rows: number): void;
$acceptProcessInput(id: number, data: string): void; $acceptProcessInput(id: number, data: string): void;
$acceptProcessResize(id: number, cols: number, rows: number): void; $acceptProcessResize(id: number, cols: number, rows: number): void;
$acceptProcessShutdown(id: number): void; $acceptProcessShutdown(id: number, immediate: boolean): void;
} }
export interface ExtHostSCMShape { export interface ExtHostSCMShape {
......
...@@ -415,8 +415,8 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { ...@@ -415,8 +415,8 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape {
} }
} }
public $acceptProcessShutdown(id: number): void { public $acceptProcessShutdown(id: number, immediate: boolean): void {
this._terminalProcesses[id].shutdown(); this._terminalProcesses[id].shutdown(immediate);
} }
private _onProcessExit(id: number, exitCode: number): void { private _onProcessExit(id: number, exitCode: number): void {
......
...@@ -382,8 +382,11 @@ export interface ITerminalInstance { ...@@ -382,8 +382,11 @@ export interface ITerminalInstance {
/** /**
* Dispose the terminal instance, removing it from the panel/service and freeing up resources. * Dispose the terminal instance, removing it from the panel/service and freeing up resources.
*
* @param isShuttingDown Whether VS Code is shutting down, if so kill any terminal processes
* immediately.
*/ */
dispose(): void; dispose(isShuttingDown?: boolean): void;
/** /**
* Registers a link matcher, allowing custom link patterns to be matched and handled. * Registers a link matcher, allowing custom link patterns to be matched and handled.
...@@ -573,6 +576,7 @@ export interface ITerminalProcessManager extends IDisposable { ...@@ -573,6 +576,7 @@ export interface ITerminalProcessManager extends IDisposable {
readonly onProcessExit: Event<number>; readonly onProcessExit: Event<number>;
addDisposable(disposable: IDisposable); addDisposable(disposable: IDisposable);
dispose(immediate?: boolean);
createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number); createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number);
write(data: string): void; write(data: string): void;
setDimensions(cols: number, rows: number): void; setDimensions(cols: number, rows: number): void;
...@@ -608,7 +612,7 @@ export interface ITerminalProcessExtHostProxy extends IDisposable { ...@@ -608,7 +612,7 @@ export interface ITerminalProcessExtHostProxy extends IDisposable {
onInput: Event<string>; onInput: Event<string>;
onResize: Event<{ cols: number, rows: number }>; onResize: Event<{ cols: number, rows: number }>;
onShutdown: Event<void>; onShutdown: Event<boolean>;
} }
export interface ITerminalProcessExtHostRequest { export interface ITerminalProcessExtHostRequest {
......
...@@ -113,7 +113,7 @@ export abstract class TerminalService implements ITerminalService { ...@@ -113,7 +113,7 @@ export abstract class TerminalService implements ITerminalService {
private _onShutdown(): void { private _onShutdown(): void {
// Dispose of all instances // Dispose of all instances
this.terminalInstances.forEach(instance => instance.dispose()); this.terminalInstances.forEach(instance => instance.dispose(true));
} }
public getTabLabels(): string[] { public getTabLabels(): string[] {
......
...@@ -563,7 +563,7 @@ export class TerminalInstance implements ITerminalInstance { ...@@ -563,7 +563,7 @@ export class TerminalInstance implements ITerminalInstance {
this._terminalFocusContextKey.set(terminalFocused); this._terminalFocusContextKey.set(terminalFocused);
} }
public dispose(): void { public dispose(isShuttingDown?: boolean): void {
this._logService.trace(`terminalInstance#dispose (id: ${this.id})`); this._logService.trace(`terminalInstance#dispose (id: ${this.id})`);
this._windowsShellHelper = lifecycle.dispose(this._windowsShellHelper); this._windowsShellHelper = lifecycle.dispose(this._windowsShellHelper);
...@@ -588,7 +588,7 @@ export class TerminalInstance implements ITerminalInstance { ...@@ -588,7 +588,7 @@ export class TerminalInstance implements ITerminalInstance {
this._xterm.dispose(); this._xterm.dispose();
this._xterm = null; this._xterm = null;
} }
this._processManager = lifecycle.dispose(this._processManager); this._processManager.dispose(isShuttingDown);
if (!this._isDisposed) { if (!this._isDisposed) {
this._isDisposed = true; this._isDisposed = true;
this._onDisposed.fire(this); this._onDisposed.fire(this);
......
...@@ -65,13 +65,13 @@ export class TerminalProcessManager implements ITerminalProcessManager { ...@@ -65,13 +65,13 @@ export class TerminalProcessManager implements ITerminalProcessManager {
}); });
} }
public dispose(): void { public dispose(immediate?: boolean): void {
if (this._process) { if (this._process) {
// If the process was still connected this dispose came from // If the process was still connected this dispose came from
// within VS Code, not the process, so mark the process as // within VS Code, not the process, so mark the process as
// killed by the user. // killed by the user.
this.processState = ProcessState.KILLED_BY_USER; this.processState = ProcessState.KILLED_BY_USER;
this._process.shutdown(); this._process.shutdown(immediate);
this._process = null; this._process = null;
} }
this._disposables.forEach(d => d.dispose()); this._disposables.forEach(d => d.dispose());
......
...@@ -19,7 +19,13 @@ export interface ITerminalChildProcess { ...@@ -19,7 +19,13 @@ export interface ITerminalChildProcess {
onProcessIdReady: Event<number>; onProcessIdReady: Event<number>;
onProcessTitleChanged: Event<string>; onProcessTitleChanged: Event<string>;
shutdown(): void; /**
* Shutdown the terminal process.
*
* @param immediate When true the process will be killed immediately, otherwise the process will
* be given some time to make sure no additional data comes through.
*/
shutdown(immediate: boolean): void;
input(data: string): void; input(data: string): void;
resize(cols: number, rows: number): void; resize(cols: number, rows: number): void;
} }
......
...@@ -97,17 +97,25 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { ...@@ -97,17 +97,25 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable {
if (this._closeTimeout) { if (this._closeTimeout) {
clearTimeout(this._closeTimeout); clearTimeout(this._closeTimeout);
} }
this._closeTimeout = setTimeout(() => { this._closeTimeout = setTimeout(() => this._kill(), 250);
// Attempt to kill the pty, it may have already been killed at this }
// point but we want to make sure
try { private _kill(): void {
// Attempt to kill the pty, it may have already been killed at this
// point but we want to make sure
try {
if (!platform.isWindows) {
// Send SIGTERM, SIGHUP does not seem to work when the parent process dies
// immediately after.
process.kill(this._ptyProcess.pid, 'SIGTERM');
} else {
this._ptyProcess.kill(); this._ptyProcess.kill();
} catch (ex) {
// Swallow, the pty has already been killed
} }
this._onProcessExit.fire(this._exitCode); } catch (ex) {
this.dispose(); // Swallow, the pty has already been killed
}, 250); }
this._onProcessExit.fire(this._exitCode);
this.dispose();
} }
private _sendProcessId() { private _sendProcessId() {
...@@ -119,8 +127,12 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { ...@@ -119,8 +127,12 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable {
this._onProcessTitleChanged.fire(this._currentTitle); this._onProcessTitleChanged.fire(this._currentTitle);
} }
public shutdown(): void { public shutdown(immediate: boolean): void {
this._queueProcessExit(); if (immediate) {
this._kill();
} else {
this._queueProcessExit();
}
} }
public input(data: string): void { public input(data: string): void {
......
...@@ -25,8 +25,8 @@ export class TerminalProcessExtHostProxy implements ITerminalChildProcess, ITerm ...@@ -25,8 +25,8 @@ export class TerminalProcessExtHostProxy implements ITerminalChildProcess, ITerm
public get onInput(): Event<string> { return this._onInput.event; } public get onInput(): Event<string> { return this._onInput.event; }
private readonly _onResize: Emitter<{ cols: number, rows: number }> = new Emitter<{ cols: number, rows: number }>(); private readonly _onResize: Emitter<{ cols: number, rows: number }> = new Emitter<{ cols: number, rows: number }>();
public get onResize(): Event<{ cols: number, rows: number }> { return this._onResize.event; } public get onResize(): Event<{ cols: number, rows: number }> { return this._onResize.event; }
private readonly _onShutdown: Emitter<void> = new Emitter<void>(); private readonly _onShutdown: Emitter<boolean> = new Emitter<boolean>();
public get onShutdown(): Event<void> { return this._onShutdown.event; } public get onShutdown(): Event<boolean> { return this._onShutdown.event; }
constructor( constructor(
public terminalId: number, public terminalId: number,
...@@ -65,8 +65,9 @@ export class TerminalProcessExtHostProxy implements ITerminalChildProcess, ITerm ...@@ -65,8 +65,9 @@ export class TerminalProcessExtHostProxy implements ITerminalChildProcess, ITerm
this._onProcessExit.fire(exitCode); this._onProcessExit.fire(exitCode);
this.dispose(); this.dispose();
} }
public shutdown(): void {
this._onShutdown.fire(); public shutdown(immediate: boolean): void {
this._onShutdown.fire(immediate);
} }
public input(data: string): void { public input(data: string): void {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册