35 lines
892 B
C#
35 lines
892 B
C#
|
|
using System;
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using System.Runtime.CompilerServices;
|
||
|
|
|
||
|
|
namespace VContainer.Internal
|
||
|
|
{
|
||
|
|
sealed class CompositeDisposable : IDisposable
|
||
|
|
{
|
||
|
|
readonly Stack<IDisposable> disposables = new Stack<IDisposable>();
|
||
|
|
|
||
|
|
public void Dispose()
|
||
|
|
{
|
||
|
|
IDisposable disposable;
|
||
|
|
do
|
||
|
|
{
|
||
|
|
lock (disposables)
|
||
|
|
{
|
||
|
|
disposable = disposables.Count > 0
|
||
|
|
? disposables.Pop()
|
||
|
|
: null;
|
||
|
|
}
|
||
|
|
disposable?.Dispose();
|
||
|
|
} while (disposable != null);
|
||
|
|
}
|
||
|
|
|
||
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||
|
|
public void Add(IDisposable disposable)
|
||
|
|
{
|
||
|
|
lock (disposables)
|
||
|
|
{
|
||
|
|
disposables.Push(disposable);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|