ReferenceCountedProviders
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading;
namespace Microsoft.Extensions.Configuration
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
internal abstract class ReferenceCountedProviders : IDisposable
{
private sealed class ActiveReferenceCountedProviders : ReferenceCountedProviders
{
private long _refCount = 1;
private volatile List<IConfigurationProvider> _providers;
public override List<IConfigurationProvider> Providers {
get {
return _providers;
}
set {
_providers = value;
}
}
public override List<IConfigurationProvider> NonReferenceCountedProviders => _providers;
public ActiveReferenceCountedProviders(List<IConfigurationProvider> providers)
{
_providers = providers;
}
public override void AddReference()
{
Interlocked.Increment(ref _refCount);
}
public override void Dispose()
{
if (Interlocked.Decrement(ref _refCount) == 0) {
foreach (IConfigurationProvider provider in _providers) {
(provider as IDisposable)?.Dispose();
}
}
}
}
private sealed class DisposedReferenceCountedProviders : ReferenceCountedProviders
{
public override List<IConfigurationProvider> Providers { get; set; }
public override List<IConfigurationProvider> NonReferenceCountedProviders => Providers;
public DisposedReferenceCountedProviders(List<IConfigurationProvider> providers)
{
Providers = providers;
}
public override void AddReference()
{
}
public override void Dispose()
{
}
}
public abstract List<IConfigurationProvider> Providers { get; set; }
public abstract List<IConfigurationProvider> NonReferenceCountedProviders { get; }
public static ReferenceCountedProviders Create(List<IConfigurationProvider> providers)
{
return new ActiveReferenceCountedProviders(providers);
}
public static ReferenceCountedProviders CreateDisposed(List<IConfigurationProvider> providers)
{
return new DisposedReferenceCountedProviders(providers);
}
public abstract void AddReference();
public abstract void Dispose();
}
}