diff --git a/src/vs/base/common/async.ts b/src/vs/base/common/async.ts index b139a807b1f92598973ed85f308e56ff2ea5b242..9eff176c7135ed7a7ef35a6260b9f1a2bb148520 100644 --- a/src/vs/base/common/async.ts +++ b/src/vs/base/common/async.ts @@ -260,29 +260,35 @@ export class ThrottledDelayer extends Delayer> { } } -export class PromiseSource { +/** + * A barrier that is initially closed and then becomes opened permanently. + */ +export class Barrier { - private _value: TPromise; - private _completeCallback: Function; - private _errorCallback: Function; + private _isOpen: boolean; + private _promise: TPromise; + private _completePromise: (v: boolean) => void; constructor() { - this._value = new TPromise((c, e) => { - this._completeCallback = c; - this._errorCallback = e; + this._isOpen = false; + this._promise = new TPromise((c, e, p) => { + this._completePromise = c; + }, () => { + console.warn('You should really not try to cancel this ready promise!'); }); } - get value(): TPromise { - return this._value; + isOpen(): boolean { + return this._isOpen; } - complete(value?: T): void { - this._completeCallback(value); + open(): void { + this._isOpen = true; + this._completePromise(true); } - error(err?: any): void { - this._errorCallback(err); + wait(): TPromise { + return this._promise; } } diff --git a/src/vs/code/electron-main/sharedProcess.ts b/src/vs/code/electron-main/sharedProcess.ts index 3a6c879f306fb0f7d1a250c293eaaf4286434760..e37c9db7df533efd918ec10a30fa2f1082776d72 100644 --- a/src/vs/code/electron-main/sharedProcess.ts +++ b/src/vs/code/electron-main/sharedProcess.ts @@ -10,12 +10,12 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { TPromise } from 'vs/base/common/winjs.base'; import { IProcessEnvironment } from 'vs/base/common/platform'; import { BrowserWindow, ipcMain } from 'electron'; -import { PromiseSource } from 'vs/base/common/async'; import { ISharedProcess } from 'vs/platform/windows/electron-main/windows'; +import { Barrier } from 'vs/base/common/async'; export class SharedProcess implements ISharedProcess { - private spawnPromiseSource: PromiseSource; + private barrier = new Barrier(); private window: Electron.BrowserWindow; private disposables: IDisposable[] = []; @@ -79,19 +79,17 @@ export class SharedProcess implements ISharedProcess { constructor( private environmentService: IEnvironmentService, private userEnv: IProcessEnvironment - ) { - this.spawnPromiseSource = new PromiseSource(); - } + ) { } - public spawn(): void { - this.spawnPromiseSource.complete(); + spawn(): void { + this.barrier.open(); } - public whenReady(): TPromise { - return this.spawnPromiseSource.value.then(() => this._whenReady); + whenReady(): TPromise { + return this.barrier.wait().then(() => this._whenReady); } - public toggle(): void { + toggle(): void { if (this.window.isVisible()) { this.hide(); } else { @@ -99,17 +97,17 @@ export class SharedProcess implements ISharedProcess { } } - public show(): void { + show(): void { this.window.show(); this.window.webContents.openDevTools(); } - public hide(): void { + hide(): void { this.window.webContents.closeDevTools(); this.window.hide(); } - public dispose(): void { + dispose(): void { this.disposables = dispose(this.disposables); } } diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index f17d72feded56d566c82c0beef24f2809d70e3fe..7679350dda8d7143dd88a936b70e96b3313b8b34 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -15,12 +15,12 @@ import { ExtHostStorage } from 'vs/workbench/api/node/extHostStorage'; import { createApiFactory, initializeExtensionApi } from 'vs/workbench/api/node/extHost.api.impl'; import { MainContext, MainThreadExtensionServiceShape, IWorkspaceData, IEnvironment, IInitData, ExtHostExtensionServiceShape, MainThreadTelemetryShape } from './extHost.protocol'; import { IExtensionMemento, ExtensionsActivator, ActivatedExtension, IExtensionAPI, IExtensionContext, EmptyExtension, IExtensionModule, ExtensionActivationTimesBuilder, ExtensionActivationTimes } from 'vs/workbench/api/node/extHostExtensionActivator'; -import { Barrier } from 'vs/workbench/services/extensions/node/barrier'; import { ExtHostThreadService } from 'vs/workbench/services/thread/node/extHostThreadService'; import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration'; import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; import { realpath } from 'fs'; import { TernarySearchTree } from 'vs/base/common/map'; +import { Barrier } from 'vs/base/common/async'; class ExtensionMemento implements IExtensionMemento { diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index ce2675295560753c3bed5c74be7238f650caac54..06a98a4786414f3f6c3c30ad1cb991127e67c100 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -26,7 +26,6 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ExtensionHostProcessWorker } from 'vs/workbench/services/extensions/electron-browser/extensionHost'; import { MainThreadService } from 'vs/workbench/services/thread/electron-browser/threadService'; -import { Barrier } from 'vs/workbench/services/extensions/node/barrier'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import { ExtHostCustomersRegistry } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { IWindowService } from 'vs/platform/windows/common/windows'; @@ -34,6 +33,7 @@ import { Action } from 'vs/base/common/actions'; import { IDisposable } from 'vs/base/common/lifecycle'; import { mark, time } from 'vs/base/common/performance'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { Barrier } from 'vs/base/common/async'; const SystemExtensionsRoot = path.normalize(path.join(URI.parse(require.toUrl('')).fsPath, '..', 'extensions')); diff --git a/src/vs/workbench/services/extensions/node/barrier.ts b/src/vs/workbench/services/extensions/node/barrier.ts deleted file mode 100644 index 2a368e23c3a383d0eb8e143a80ad15fcd5079ce6..0000000000000000000000000000000000000000 --- a/src/vs/workbench/services/extensions/node/barrier.ts +++ /dev/null @@ -1,39 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; - -/** - * A barrier that is initially closed and then becomes opened permanently. - */ -export class Barrier { - - private _isOpen: boolean; - private _promise: TPromise; - private _completePromise: (v: boolean) => void; - - constructor() { - this._isOpen = false; - this._promise = new TPromise((c, e, p) => { - this._completePromise = c; - }, () => { - console.warn('You should really not try to cancel this ready promise!'); - }); - } - - public isOpen(): boolean { - return this._isOpen; - } - - public open(): void { - this._isOpen = true; - this._completePromise(true); - } - - public wait(): TPromise { - return this._promise; - } -} diff --git a/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts b/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts index 9d8c2cb2ec4ebddba319a50ae836c12ad8e81ea1..30dfa303f36f3e76ea84c77fc870679e6aaacfae 100644 --- a/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts +++ b/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts @@ -14,7 +14,7 @@ import { ipcRenderer as ipc } from 'electron'; import Event, { Emitter } from 'vs/base/common/event'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { mark } from 'vs/base/common/performance'; -import { Barrier } from 'vs/workbench/services/extensions/node/barrier'; +import { Barrier } from 'vs/base/common/async'; export class LifecycleService implements ILifecycleService {