debt - fix a leak in DiskFileSystemProviderClient.readFileStream (#192893)

This commit is contained in:
Benjamin Pasero
2023-09-12 18:21:59 +02:00
committed by GitHub
parent 6bb64ab400
commit 1a323a474d
@@ -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<Uint8Array> {
const stream = newWriteableStream<Uint8Array>(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<ReadableStreamEventPayload<VSBuffer>>('readFileStream', [resource, opts])(dataOrErrorOrEnd => {
disposables.add(this.channel.listen<ReadableStreamEventPayload<VSBuffer>>('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;
}