From ff06093347da935197c8cd67823b5b9be0d6ff98 Mon Sep 17 00:00:00 2001 From: Ivan Murashka Date: Tue, 4 Nov 2025 10:51:34 +0100 Subject: [PATCH] Dispose late additions in ControllerCompositeDisposable --- .../Utils/ControllerCompositeDisposable.cs | 62 +++++++++++++++---- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/src/ControllersTree/Core/Utils/ControllerCompositeDisposable.cs b/src/ControllersTree/Core/Utils/ControllerCompositeDisposable.cs index 434a0d5..c8d911c 100644 --- a/src/ControllersTree/Core/Utils/ControllerCompositeDisposable.cs +++ b/src/ControllersTree/Core/Utils/ControllerCompositeDisposable.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; using UnityEngine.Pool; namespace Playtika.Controllers @@ -11,6 +10,7 @@ namespace Playtika.Controllers public class ControllerCompositeDisposable : IDisposable { private readonly List _disposables = ListPool.Get(); + private bool _disposed = false; /// /// Adds a disposable object to the internal list of disposables. @@ -18,7 +18,14 @@ public class ControllerCompositeDisposable : IDisposable /// The disposable object to add to the list. public void Add(IDisposable disposable) { - _disposables.Add(disposable); + if (_disposed) + { + disposable?.Dispose(); + } + else + { + _disposables.Add(disposable); + } } /// @@ -27,18 +34,49 @@ public void Add(IDisposable disposable) /// The collection of disposable objects to add to the list. public void AddRange(IEnumerable collection) { - _disposables.AddRange(collection); + if (collection == null) + { + return; + } + if (_disposed) + { + using var pooledObject = ListPool.Get(out var disposablesList); + disposablesList.AddRange(collection); + DisposeMany(disposablesList); + } + else + { + _disposables.AddRange(collection); + } } public void Dispose() { - using var pooledObject = ListPool.Get(out var exceptionList); + if (_disposed) + { + return; + } + + _disposed = true; + + try + { + DisposeMany(_disposables); + } + finally + { + ListPool.Release(_disposables); + } + } - foreach (var disposable in _disposables) + private static void DisposeMany(IEnumerable disposables) + { + using var pooledObject = ListPool.Get(out var exceptionList); + foreach (var disposable in disposables) { try { - disposable.Dispose(); + disposable?.Dispose(); } catch (Exception e) { @@ -46,14 +84,12 @@ public void Dispose() } } - _disposables.Clear(); - - ListPool.Release(_disposables); - - if (exceptionList.Any()) + switch (exceptionList.Count) { - throw new AggregateException(exceptionList); + case 0: return; + case 1: throw exceptionList[0]; + default: throw new AggregateException(exceptionList); } } } -} +} \ No newline at end of file