From bb7db0098c2685e24af0c71d6710df4675e597f9 Mon Sep 17 00:00:00 2001 From: Matthew O'Connor Date: Fri, 16 May 2025 11:58:04 -0600 Subject: [PATCH] Revert incorrect "fix" and improve test. --- Xledger.Collections.Test/TestMemoryOwner.cs | 8 ++++++-- Xledger.Collections/Memory/Extensions.cs | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Xledger.Collections.Test/TestMemoryOwner.cs b/Xledger.Collections.Test/TestMemoryOwner.cs index c3ea828..1906e7d 100644 --- a/Xledger.Collections.Test/TestMemoryOwner.cs +++ b/Xledger.Collections.Test/TestMemoryOwner.cs @@ -26,7 +26,9 @@ public void TestSlice() { #if NET [Fact] public void TestStream_ToMemoryOwner() { - byte[] array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + // This length should be larger than the default GetCopyBufferSize. + byte[] array = new byte[4 * 1024 * 1024 + 3]; + new Random().NextBytes(array); var ms = new MemoryStream(array); using var memoryOwner = ms.ToOwnedMemory(); Assert.Equal(array.AsMemory(), memoryOwner.Memory); @@ -34,7 +36,9 @@ public void TestStream_ToMemoryOwner() { [Fact] public async Task TestStream_ToMemoryOwnerAsync() { - byte[] array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + // This length should be larger than the default GetCopyBufferSize. + byte[] array = new byte[4 * 1024 * 1024 + 3]; + new Random().NextBytes(array); var ms = new MemoryStream(array); using var memoryOwner = await ms.ToOwnedMemoryAsync(); Assert.Equal(array.AsMemory(), memoryOwner.Memory); diff --git a/Xledger.Collections/Memory/Extensions.cs b/Xledger.Collections/Memory/Extensions.cs index a196b4d..df0fc7d 100644 --- a/Xledger.Collections/Memory/Extensions.cs +++ b/Xledger.Collections/Memory/Extensions.cs @@ -38,7 +38,9 @@ public static IMemoryOwner ToOwnedMemory(this Stream source, bool leaveOpe try { while (true) { - int bytesRead = source.Read(currentBuffer.Span); + var dest = currentBuffer.Slice(totalBytesRead); + + int bytesRead = source.Read(dest.Span); if (bytesRead == 0) { break; @@ -100,7 +102,9 @@ public static async Task> ToOwnedMemoryAsync(this Stream sour while (true) { tok.ThrowIfCancellationRequested(); - int bytesRead = await source.ReadAsync(currentBuffer, tok).ConfigureAwait(false); + var dest = currentBuffer.Slice(totalBytesRead); + + int bytesRead = await source.ReadAsync(dest, tok).ConfigureAwait(false); if (bytesRead == 0) { break;