From bd56c00176ae9b241a86ea80626cf90f33d29989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Sat, 18 Feb 2023 11:59:51 +0100 Subject: [PATCH] feat: return array to ArrayPool in PacketStringBuilder --- .../PacketStringBuilder.cs | 19 +++++++++++++++++++ .../PacketSerializer.cs | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Packets/NosSmooth.PacketSerializer.Abstractions/PacketStringBuilder.cs b/Packets/NosSmooth.PacketSerializer.Abstractions/PacketStringBuilder.cs index 1ee285c..0ddd69f 100644 --- a/Packets/NosSmooth.PacketSerializer.Abstractions/PacketStringBuilder.cs +++ b/Packets/NosSmooth.PacketSerializer.Abstractions/PacketStringBuilder.cs @@ -16,6 +16,7 @@ namespace NosSmooth.PacketSerializer.Abstractions; public ref struct PacketStringBuilder { private Span _buffer; + private char[]? _bufferArray; private int _position; private StringBuilderLevel _currentLevel; private char? _insertSeparator; @@ -31,6 +32,7 @@ public ref struct PacketStringBuilder _insertSeparator = null; _buffer = initialBuffer; _position = 0; + _bufferArray = null; } /// @@ -226,6 +228,17 @@ public ref struct PacketStringBuilder public void Append(decimal value) => AppendSpanFormattable(value); + /// + /// Returns buffer to ArrayPool if it has been used. + /// + public void Dispose() + { + if (_bufferArray is not null) + { + ArrayPool.Shared.Return(_bufferArray); + } + } + private void AppendSpanFormattable(T value) where T : ISpanFormattable { @@ -248,6 +261,12 @@ public ref struct PacketStringBuilder _buffer.CopyTo(newBuffer); _buffer = newBuffer; + + if (_bufferArray is not null) + { + ArrayPool.Shared.Return(_bufferArray); + } + _bufferArray = newBuffer; } private void BeforeAppend() diff --git a/Packets/NosSmooth.PacketSerializer/PacketSerializer.cs b/Packets/NosSmooth.PacketSerializer/PacketSerializer.cs index 9def170..f24e974 100644 --- a/Packets/NosSmooth.PacketSerializer/PacketSerializer.cs +++ b/Packets/NosSmooth.PacketSerializer/PacketSerializer.cs @@ -34,7 +34,7 @@ public class PacketSerializer : IPacketSerializer /// public Result Serialize(IPacket obj) { - var stringBuilder = new PacketStringBuilder(stackalloc char[500]); + using var stringBuilder = new PacketStringBuilder(stackalloc char[500]); var infoResult = _packetTypesRepository.FindPacketInfo(obj.GetType()); if (!infoResult.IsSuccess) { -- 2.49.0