From 1a323a474ddbdebdcd8517e5429afc60e61493fd Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 12 Sep 2023 18:21:59 +0200 Subject: [PATCH] debt - fix a leak in `DiskFileSystemProviderClient.readFileStream` (#192893) --- .../files/common/diskFileSystemProviderClient.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/vs/platform/files/common/diskFileSystemProviderClient.ts b/src/vs/platform/files/common/diskFileSystemProviderClient.ts index f277238bbd3..d3719ddd0e7 100644 --- a/src/vs/platform/files/common/diskFileSystemProviderClient.ts +++ b/src/vs/platform/files/common/diskFileSystemProviderClient.ts @@ -8,7 +8,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { canceled } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { newWriteableStream, ReadableStreamEventPayload, ReadableStreamEvents } from 'vs/base/common/stream'; import { URI, UriComponents } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; @@ -93,9 +93,10 @@ export class DiskFileSystemProviderClient extends Disposable implements readFileStream(resource: URI, opts: IFileReadStreamOptions, token: CancellationToken): ReadableStreamEvents { const stream = newWriteableStream(data => VSBuffer.concat(data.map(data => VSBuffer.wrap(data))).buffer); + const disposables = new DisposableStore(); // Reading as file stream goes through an event to the remote side - const listener = this.channel.listen>('readFileStream', [resource, opts])(dataOrErrorOrEnd => { + disposables.add(this.channel.listen>('readFileStream', [resource, opts])(dataOrErrorOrEnd => { // data if (dataOrErrorOrEnd instanceof VSBuffer) { @@ -128,12 +129,12 @@ export class DiskFileSystemProviderClient extends Disposable implements } // Signal to the remote side that we no longer listen - listener.dispose(); + disposables.dispose(); } - }); + })); // Support cancellation - token.onCancellationRequested(() => { + disposables.add(token.onCancellationRequested(() => { // Ensure to end the stream properly with an error // to indicate the cancellation. @@ -143,8 +144,8 @@ export class DiskFileSystemProviderClient extends Disposable implements // Ensure to dispose the listener upon cancellation. This will // bubble through the remote side as event and allows to stop // reading the file. - listener.dispose(); - }); + disposables.dispose(); + })); return stream; }