Path: blob/main/scripts/chat-simulation/fixtures/_chatperf_lifecycle.ts
13383 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45// perf-benchmark-marker67/**8* Fixture for chat-simulation benchmarks.9* Simplified from src/vs/base/common/lifecycle.ts for stable perf testing.10*/1112export interface IDisposable {13dispose(): void;14}1516export function isDisposable<T extends object>(thing: T): thing is T & IDisposable {17return typeof (thing as IDisposable).dispose === 'function'18&& (thing as IDisposable).dispose.length === 0;19}2021export function dispose<T extends IDisposable>(disposable: T): T;22export function dispose<T extends IDisposable>(disposable: T | undefined): T | undefined;23export function dispose<T extends IDisposable>(disposables: T[]): T[];24export function dispose<T extends IDisposable>(disposables: readonly T[]): readonly T[];25export function dispose<T extends IDisposable>(arg: T | T[] | undefined): any {26if (Array.isArray(arg)) {27const errors: any[] = [];28for (const d of arg) {29try { d.dispose(); } catch (e) { errors.push(e); }30}31if (errors.length > 0) { throw new Error(`Dispose errors: ${errors.length}`); }32return arg;33} else if (arg) {34arg.dispose();35return arg;36}37}3839export class DisposableStore implements IDisposable {40private readonly _toDispose = new Set<IDisposable>();41private _isDisposed = false;4243dispose(): void {44if (this._isDisposed) { return; }45this._isDisposed = true;46this.clear();47}4849clear(): void {50if (this._toDispose.size === 0) { return; }51const iter = this._toDispose.values();52this._toDispose.clear();53for (const item of iter) {54try { item.dispose(); } catch { }55}56}5758add<T extends IDisposable>(o: T): T {59if (this._isDisposed) {60console.warn('Adding to a disposed DisposableStore');61return o;62}63this._toDispose.add(o);64return o;65}6667get size(): number { return this._toDispose.size; }68}6970export abstract class Disposable implements IDisposable {71private readonly _store = new DisposableStore();7273dispose(): void {74this._store.dispose();75}7677protected _register<T extends IDisposable>(o: T): T {78return this._store.add(o);79}80}8182export class MutableDisposable<T extends IDisposable> implements IDisposable {83private _value?: T;84private _isDisposed = false;8586get value(): T | undefined { return this._isDisposed ? undefined : this._value; }8788set value(value: T | undefined) {89if (this._isDisposed || value === this._value) { return; }90this._value?.dispose();91this._value = value;92}9394dispose(): void {95this._isDisposed = true;96this._value?.dispose();97this._value = undefined;98}99}100101export class DisposableMap<K, V extends IDisposable> implements IDisposable {102private readonly _map = new Map<K, V>();103private _isDisposed = false;104105set(key: K, value: V): void {106const existing = this._map.get(key);107if (existing !== value) {108existing?.dispose();109this._map.set(key, value);110}111}112113get(key: K): V | undefined { return this._map.get(key); }114115delete(key: K): void {116this._map.get(key)?.dispose();117this._map.delete(key);118}119120dispose(): void {121if (this._isDisposed) { return; }122this._isDisposed = true;123for (const [, v] of this._map) { v.dispose(); }124this._map.clear();125}126}127128129