From e023d81ce87132de28b5150ec76cf10859b4247e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 21 Sep 2016 10:23:58 +0200 Subject: [PATCH] ipc: send client ids when connecting --- src/vs/base/parts/ipc/node/ipc.net.ts | 6 +++--- src/vs/code/electron-main/main.ts | 2 +- src/vs/code/node/sharedProcessMain.ts | 2 +- src/vs/workbench/electron-browser/shell.ts | 20 +++++++++---------- src/vs/workbench/node/extensionHostProcess.ts | 2 +- src/vs/workbench/parts/git/node/askpass.ts | 2 +- .../thread/electron-browser/threadService.ts | 7 ++++++- 7 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/vs/base/parts/ipc/node/ipc.net.ts b/src/vs/base/parts/ipc/node/ipc.net.ts index aa6b65b3b7f..a25e321f59b 100644 --- a/src/vs/base/parts/ipc/node/ipc.net.ts +++ b/src/vs/base/parts/ipc/node/ipc.net.ts @@ -207,9 +207,9 @@ export function serve(hook: any): TPromise { }); } -export function connect(port: number, clientId?: string): TPromise; -export function connect(namedPipe: string, clientId?: string): TPromise; -export function connect(hook: any, clientId: string = ''): TPromise { +export function connect(port: number, clientId: string): TPromise; +export function connect(namedPipe: string, clientId: string): TPromise; +export function connect(hook: any, clientId: string): TPromise { return new TPromise((c, e) => { const socket = createConnection(hook, () => { socket.removeListener('error', e); diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index b648585c699..b0e34c1b1e5 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -237,7 +237,7 @@ function setupIPC(accessor: ServicesAccessor): TPromise { } // there's a running instance, let's connect to it - return connect(environmentService.mainIPCHandle).then( + return connect(environmentService.mainIPCHandle, 'main').then( client => { // Tests from CLI require to be the only instance currently (TODO@Ben support multiple instances and output) diff --git a/src/vs/code/node/sharedProcessMain.ts b/src/vs/code/node/sharedProcessMain.ts index cd0785ebae2..2a82b49e7f3 100644 --- a/src/vs/code/node/sharedProcessMain.ts +++ b/src/vs/code/node/sharedProcessMain.ts @@ -122,7 +122,7 @@ function setupIPC(hook: string): TPromise { // should retry, not windows and eaddrinuse - return connect(hook).then( + return connect(hook, '').then( client => { // we could connect to a running instance. this is not good, abort client.dispose(); diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 46dd9696b6b..854c7c9301e 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -211,16 +211,6 @@ export class WorkbenchShell { private initServiceCollection(container: HTMLElement): [InstantiationService, ServiceCollection] { const disposables = new Disposables(); - const sharedProcess = connectNet(this.environmentService.sharedIPCHandle); - sharedProcess.done(client => { - client.onClose(() => { - this.messageService.show(Severity.Error, { - message: nls.localize('sharedProcessCrashed', "The shared process terminated unexpectedly. Please reload the window to recover."), - actions: [instantiationService.createInstance(ReloadWindowAction, ReloadWindowAction.ID, ReloadWindowAction.LABEL)] - }); - }); - }, errors.onUnexpectedError); - const mainProcessClient = new ElectronIPCClient(ipcRenderer); disposables.add(mainProcessClient); @@ -235,6 +225,16 @@ export class WorkbenchShell { this.windowService = instantiationService.createInstance(WindowService); serviceCollection.set(IWindowService, this.windowService); + const sharedProcess = connectNet(this.environmentService.sharedIPCHandle, `window:${ this.windowService.getWindowId() }`); + sharedProcess.done(client => { + client.onClose(() => { + this.messageService.show(Severity.Error, { + message: nls.localize('sharedProcessCrashed', "The shared process terminated unexpectedly. Please reload the window to recover."), + actions: [instantiationService.createInstance(ReloadWindowAction, ReloadWindowAction.ID, ReloadWindowAction.LABEL)] + }); + }); + }, errors.onUnexpectedError); + // Storage const disableWorkspaceStorage = this.environmentService.extensionTestsPath || (!this.workspace && !this.environmentService.extensionDevelopmentPath); // without workspace or in any extension test, we use inMemory storage unless we develop an extension where we want to preserve state this.storageService = instantiationService.createInstance(Storage, window.localStorage, disableWorkspaceStorage ? inMemoryLocalStorageInstance : window.localStorage); diff --git a/src/vs/workbench/node/extensionHostProcess.ts b/src/vs/workbench/node/extensionHostProcess.ts index 8a45c979de1..f37d2f14855 100644 --- a/src/vs/workbench/node/extensionHostProcess.ts +++ b/src/vs/workbench/node/extensionHostProcess.ts @@ -104,7 +104,7 @@ function connectToRenderer(): TPromise { } function connectToSharedProcess(): TPromise { - return connect(process.env['VSCODE_SHARED_IPC_HOOK']); + return connect(process.env['VSCODE_SHARED_IPC_HOOK'], `extensionHost:${ process.env['VSCODE_WINDOW_ID'] }`); } TPromise.join([connectToRenderer(), connectToSharedProcess()]) diff --git a/src/vs/workbench/parts/git/node/askpass.ts b/src/vs/workbench/parts/git/node/askpass.ts index 0398cd04414..f2b45f8f1b6 100644 --- a/src/vs/workbench/parts/git/node/askpass.ts +++ b/src/vs/workbench/parts/git/node/askpass.ts @@ -36,7 +36,7 @@ function main(argv: string[]): void { var request = argv[2]; var host = argv[4].substring(1, argv[4].length - 2); - connect(process.env['VSCODE_IPC_HOOK']) + connect(process.env['VSCODE_IPC_HOOK'], 'askpass') .then(client => { const channel = client.getChannel('askpass'); const service = new AskpassChannelClient(channel); diff --git a/src/vs/workbench/services/thread/electron-browser/threadService.ts b/src/vs/workbench/services/thread/electron-browser/threadService.ts index 49883252fbc..4e065903f3d 100644 --- a/src/vs/workbench/services/thread/electron-browser/threadService.ts +++ b/src/vs/workbench/services/thread/electron-browser/threadService.ts @@ -123,7 +123,12 @@ class ExtensionHostProcessManager { public startExtensionHostProcess(onExtensionHostMessage: (msg: any) => void): void { let opts: any = { - env: objects.mixin(objects.clone(process.env), { AMD_ENTRYPOINT: 'vs/workbench/node/extensionHostProcess', PIPE_LOGGING: 'true', VERBOSE_LOGGING: true }) + env: objects.mixin(objects.clone(process.env), { + AMD_ENTRYPOINT: 'vs/workbench/node/extensionHostProcess', + PIPE_LOGGING: 'true', + VERBOSE_LOGGING: true, + VSCODE_WINDOW_ID: String(this.windowService.getWindowId()) + }) }; // Help in case we fail to start it