| File: BufferWriterPool\BufferWriterPooledObjectPolicy.cs | Web Access |
| Project: src\src\Shared\Shared.csproj (Shared) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.Extensions.ObjectPool; using Microsoft.Shared.Diagnostics; #pragma warning disable CA1716 namespace Microsoft.Shared.Pools; #pragma warning restore CA1716 /// <summary> /// An object pooling policy designed for <see cref="BufferWriter{T}"/>. /// </summary> /// <typeparam name="T">The type of objects to hold in the buffer writer.</typeparam> #if !SHARED_PROJECT [System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] #endif internal sealed class BufferWriterPooledObjectPolicy<T> : PooledObjectPolicy<BufferWriter<T>> { /// <summary> /// Default maximum retained capacity of buffer writer instances in the pool. /// </summary> private const int DefaultMaximumRetainedCapacity = 256 * 1024; /// <summary> /// Initializes a new instance of the <see cref="BufferWriterPooledObjectPolicy{T}"/> class. /// </summary> /// <param name="maximumRetainedCapacity"> /// The maximum capacity of <see cref="BufferWriter{T}"/> to keep in the pool. /// If an object is returned to the pool whose capacity exceeds this number, the object /// instance is not added to the pool, and thus becomes eligible for garbage collection. /// </param> public BufferWriterPooledObjectPolicy(int maximumRetainedCapacity = DefaultMaximumRetainedCapacity) { MaximumRetainedCapacity = Throw.IfLessThan(maximumRetainedCapacity, 1); } /// <summary> /// Gets the maximum capacity of <see cref="BufferWriter{T}"/> to keep in the pool. /// </summary> /// <remarks> /// If an object is returned to the pool whose capacity exceeds this number, the object /// instance is not added to the pool, and thus becomes eligible for garbage collection. /// Default maximum retained capacity is 256 * 1024 bytes. /// </remarks> public int MaximumRetainedCapacity { get; } /// <summary> /// Creates an instance of <see cref="BufferWriter{T}"/>. /// </summary> /// <returns>The newly created instance.</returns> public override BufferWriter<T> Create() => new(); /// <summary> /// Performs any work needed before returning an object to a pool. /// </summary> /// <param name="obj">The object to return to a pool.</param> /// <returns>true if the object should be returned to the pool, false if it shouldn't.</returns> public override bool Return(BufferWriter<T> obj) { _ = Throw.IfNull(obj); if (obj.Capacity > MaximumRetainedCapacity) { // Too big. Discard this one. return false; } obj.Reset(); return true; } }