From ebd1e79d679ea16a7395691e3d2ff49879433361 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 24 Apr 2022 01:17:32 -0700 Subject: [PATCH] Add ValueTask pooling in more places - Use ValueTask pooling on StreamPipeReader.ReadAsync and ReadAtLeastAsync and StreamPipeWriter.FlushAsync --- .../src/System/IO/Pipelines/StreamPipeReader.cs | 7 +++++++ .../src/System/IO/Pipelines/StreamPipeWriter.cs | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeReader.cs b/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeReader.cs index 9b101ce7ac2de2..0cc899d29312e1 100644 --- a/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeReader.cs +++ b/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeReader.cs @@ -3,6 +3,7 @@ using System.Buffers; using System.Diagnostics; +using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; @@ -217,6 +218,9 @@ public override ValueTask ReadAsync(CancellationToken cancellationTo return Core(this, tokenSource, cancellationToken); +#if NETCOREAPP + [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder<>))] +#endif static async ValueTask Core(StreamPipeReader reader, CancellationTokenSource tokenSource, CancellationToken cancellationToken) { CancellationTokenRegistration reg = default; @@ -302,6 +306,9 @@ protected override ValueTask ReadAtLeastAsyncCore(int minimumSize, C return Core(this, minimumSize, tokenSource, cancellationToken); +#if NETCOREAPP + [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder<>))] +#endif static async ValueTask Core(StreamPipeReader reader, int minimumSize, CancellationTokenSource tokenSource, CancellationToken cancellationToken) { CancellationTokenRegistration reg = default; diff --git a/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeWriter.cs b/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeWriter.cs index 59c14e4ecd2e02..a8363343ebe059 100644 --- a/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeWriter.cs +++ b/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeWriter.cs @@ -3,6 +3,7 @@ using System.Buffers; using System.Diagnostics; +using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; @@ -288,6 +289,9 @@ private void Cancel() InternalTokenSource.Cancel(); } +#if NETCOREAPP + [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder<>))] +#endif private async ValueTask FlushAsyncInternal(bool writeToStream, ReadOnlyMemory data, CancellationToken cancellationToken = default) { // Write all completed segments and whatever remains in the current segment