diff --git a/src/ControllersTree/Core/Utils/ControllerCompositeDisposable.cs b/src/ControllersTree/Core/Utils/ControllerCompositeDisposable.cs index 434a0d5..a0a7b47 100644 --- a/src/ControllersTree/Core/Utils/ControllerCompositeDisposable.cs +++ b/src/ControllersTree/Core/Utils/ControllerCompositeDisposable.cs @@ -11,6 +11,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 +19,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 if (disposable != null) + { + _disposables.Add(disposable); + } } /// @@ -27,18 +35,50 @@ 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 +86,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.ToList()); } } } -} +} \ No newline at end of file