From 6ffa7d5887e60244169ef9699842ff276216be10 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 12 Feb 2020 11:09:46 +0100 Subject: [PATCH] CancellationToken#onCancellationRequested is a once-event by definition, helps with #81574 --- src/vs/base/common/cancellation.ts | 5 ++++- src/vs/base/node/zip.ts | 5 ++--- src/vs/monaco.d.ts | 5 ++++- .../services/remote/common/remoteAgentFileSystemChannel.ts | 4 ++-- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/vs/base/common/cancellation.ts b/src/vs/base/common/cancellation.ts index 3685d4ded0a55..75b615de669bf 100644 --- a/src/vs/base/common/cancellation.ts +++ b/src/vs/base/common/cancellation.ts @@ -14,7 +14,10 @@ export interface CancellationToken { readonly isCancellationRequested: boolean; /** - * An event which fires when cancellation is requested. + * An event which fires when cancellation is requested. This event + * only ever fires `once` as cancellation can only happen once. Listeners + * that are registered after cancellation will be called (next event loop run), + * but also only once. * * @event */ diff --git a/src/vs/base/node/zip.ts b/src/vs/base/node/zip.ts index 93ebb6ad60756..8047aa275f75c 100644 --- a/src/vs/base/node/zip.ts +++ b/src/vs/base/node/zip.ts @@ -12,7 +12,6 @@ import { mkdirp, rimraf } from 'vs/base/node/pfs'; import { open as _openZip, Entry, ZipFile } from 'yauzl'; import * as yazl from 'yazl'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { Event } from 'vs/base/common/event'; export interface IExtractOptions { overwrite?: boolean; @@ -80,7 +79,7 @@ function extractEntry(stream: Readable, fileName: string, mode: number, targetPa let istream: WriteStream; - Event.once(token.onCancellationRequested)(() => { + token.onCancellationRequested(() => { if (istream) { istream.destroy(); } @@ -107,7 +106,7 @@ function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions, tok let last = createCancelablePromise(() => Promise.resolve()); let extractedEntriesCount = 0; - Event.once(token.onCancellationRequested)(() => { + token.onCancellationRequested(() => { last.cancel(); zipfile.close(); }); diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 87eaed8608c85..ff031806fb3ff 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -59,7 +59,10 @@ declare namespace monaco { */ readonly isCancellationRequested: boolean; /** - * An event which fires when cancellation is requested. + * An event which fires when cancellation is requested. This event + * only ever fires `once` as cancellation can only happen once. Listeners + * that are registered after cancellation will be called (next event loop run), + * but also only once. * * @event */ diff --git a/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel.ts b/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel.ts index 71da8dc93e3df..1ef4d9c4bcffe 100644 --- a/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel.ts +++ b/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Emitter, Event } from 'vs/base/common/event'; +import { Emitter } from 'vs/base/common/event'; import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; @@ -153,7 +153,7 @@ export class RemoteFileSystemProvider extends Disposable implements // Support cancellation if (token) { - Event.once(token.onCancellationRequested)(() => { + token.onCancellationRequested(() => { // Ensure to end the stream properly with an error // to indicate the cancellation.