From 8118408002cacab04df1e46eb9caa7a4980fac7e Mon Sep 17 00:00:00 2001 From: BorisDog Date: Wed, 1 Oct 2025 15:11:52 -0700 Subject: [PATCH] CSHARP-5663: Avoid RentedBuffer boxing in DisposableSegment --- src/MongoDB.Bson/IO/EncodingHelper.cs | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/MongoDB.Bson/IO/EncodingHelper.cs b/src/MongoDB.Bson/IO/EncodingHelper.cs index a7fa16527e3..969ba77a949 100644 --- a/src/MongoDB.Bson/IO/EncodingHelper.cs +++ b/src/MongoDB.Bson/IO/EncodingHelper.cs @@ -25,22 +25,33 @@ internal static class EncodingHelper { public readonly struct DisposableSegment : IDisposable { - private IDisposable DisposableData { get; } + private bool DisposeRentedBuffer { get; } + private ThreadStaticBuffer.RentedBuffer RentedBuffer { get; } public ArraySegment Segment { get; } - public DisposableSegment(IDisposable disposableData, ArraySegment segment) + public DisposableSegment(ThreadStaticBuffer.RentedBuffer rentedBuffer, ArraySegment segment) { - DisposableData = disposableData; + DisposeRentedBuffer = true; + RentedBuffer = rentedBuffer; + Segment = segment; + } + + public DisposableSegment(ArraySegment segment) + { + DisposeRentedBuffer = false; Segment = segment; } public void Dispose() { - DisposableData?.Dispose(); + if (DisposeRentedBuffer) + { + RentedBuffer.Dispose(); + } } } - private static readonly ArraySegment __emptySegment = new ArraySegment(new byte[0]); + private static readonly ArraySegment __emptySegment = new(new byte[0]); public static DisposableSegment GetBytesUsingThreadStaticBuffer(this Encoding encoding, string value) { @@ -57,7 +68,7 @@ public static DisposableSegment GetBytesUsingThreadStaticBuffer(this Encoding en var length = value.Length; if (length == 0) { - return new DisposableSegment(null, __emptySegment); + return new DisposableSegment(__emptySegment); } var maxSize = encoding.GetMaxByteCount(length);