From 84cdac952a5dfaeb9b5b5bac987e2312d0fd3e15 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Mon, 11 Feb 2019 13:58:25 -0800 Subject: [PATCH 1/3] AsTask => GetAsTask() --- .../src/Internal/Http/Http1OutputProducer.cs | 2 +- .../Core/src/Internal/Http/HttpProtocol.cs | 6 ++--- .../src/Internal/Http/ValueTaskExtensions.cs | 27 +++++++++++++++++++ .../src/Internal/Http2/Http2OutputProducer.cs | 2 +- 4 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 src/Servers/Kestrel/Core/src/Internal/Http/ValueTaskExtensions.cs diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/Http1OutputProducer.cs b/src/Servers/Kestrel/Core/src/Internal/Http/Http1OutputProducer.cs index 0286ce0db0d9..e6747579ef6b 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http/Http1OutputProducer.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http/Http1OutputProducer.cs @@ -80,7 +80,7 @@ public Task WriteDataAsync(ReadOnlySpan buffer, CancellationToken cancella return Task.FromCanceled(cancellationToken); } - return WriteAsync(buffer, cancellationToken).AsTask(); + return WriteAsync(buffer, cancellationToken).GetAsTask(); } public ValueTask WriteDataToPipeAsync(ReadOnlySpan buffer, CancellationToken cancellationToken = default) diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.cs b/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.cs index 78e5e60f4da1..b3cfacae5b4f 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.cs @@ -796,7 +796,7 @@ private async Task FireOnCompletedAwaited(Task currentTask, Stack WritePipeAsync(ReadOnlyMemory data, Cancella public Task FlushAsync(CancellationToken cancellationToken = default) { - return FlushPipeAsync(cancellationToken).AsTask(); + return FlushPipeAsync(cancellationToken).GetAsTask(); } [MethodImpl(MethodImplOptions.NoInlining)] @@ -1386,7 +1386,7 @@ private async ValueTask FlushAsyncAwaited(Task initializeTask, Canc public Task WriteAsync(ReadOnlyMemory data, CancellationToken cancellationToken = default(CancellationToken)) { - return WritePipeAsync(data, cancellationToken).AsTask(); + return WritePipeAsync(data, cancellationToken).GetAsTask(); } public async ValueTask WriteAsyncAwaited(Task initializeTask, ReadOnlyMemory data, CancellationToken cancellationToken) diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/ValueTaskExtensions.cs b/src/Servers/Kestrel/Core/src/Internal/Http/ValueTaskExtensions.cs new file mode 100644 index 000000000000..a23b85030e09 --- /dev/null +++ b/src/Servers/Kestrel/Core/src/Internal/Http/ValueTaskExtensions.cs @@ -0,0 +1,27 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO.Pipelines; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; + +namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http +{ + internal static class ValueTaskExtensions + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Task GetAsTask(this in ValueTask valueTask) + { + if (valueTask.IsCompletedSuccessfully) + { + // Signal consumption to the IValueTaskSource + valueTask.GetAwaiter().GetResult(); + return Task.CompletedTask; + } + else + { + return valueTask.AsTask(); + } + } + } +} diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2OutputProducer.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2OutputProducer.cs index 071518150461..fdffeda7c08c 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2OutputProducer.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2OutputProducer.cs @@ -164,7 +164,7 @@ public Task WriteDataAsync(ReadOnlySpan data, CancellationToken cancellati _startedWritingDataFrames = true; _dataPipe.Writer.Write(data); - return _flusher.FlushAsync(this, cancellationToken).AsTask(); + return _flusher.FlushAsync(this, cancellationToken).GetAsTask(); } } From 371c29577b6cecada63d9a854c83c03043ccefdb Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Mon, 11 Feb 2019 14:42:02 -0800 Subject: [PATCH 2/3] Another spot --- .../Core/src/Internal/Infrastructure/TimingPipeFlusher.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TimingPipeFlusher.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TimingPipeFlusher.cs index 190aaf5ac237..1c0a9c65ac44 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TimingPipeFlusher.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TimingPipeFlusher.cs @@ -72,7 +72,7 @@ public ValueTask FlushAsync(MinDataRate minRate, long count, IHttpO { if (_lastFlushTask == null || _lastFlushTask.IsCompleted) { - _lastFlushTask = flushValueTask.AsTask(); + _lastFlushTask = flushValueTask.GetAsTask(); } return TimeFlushAsync(minRate, count, outputAborter, cancellationToken); From e5f31f264cbc4e21c501ae4e8b39d5e235348b20 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Mon, 11 Feb 2019 15:10:30 -0800 Subject: [PATCH 3/3] Another spot --- .../Core/src/Internal/Infrastructure/TimingPipeFlusher.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TimingPipeFlusher.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TimingPipeFlusher.cs index 1c0a9c65ac44..190aaf5ac237 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TimingPipeFlusher.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TimingPipeFlusher.cs @@ -72,7 +72,7 @@ public ValueTask FlushAsync(MinDataRate minRate, long count, IHttpO { if (_lastFlushTask == null || _lastFlushTask.IsCompleted) { - _lastFlushTask = flushValueTask.GetAsTask(); + _lastFlushTask = flushValueTask.AsTask(); } return TimeFlushAsync(minRate, count, outputAborter, cancellationToken);