From 0e5f123f6b1792bf19fe21143a6d668b6ce8f483 Mon Sep 17 00:00:00 2001 From: Alexis Christoforides Date: Wed, 7 Nov 2018 07:26:46 -0500 Subject: [corlib] Import System.IO.Stream/BufferedStream from CoreFX (#26) Merge with https://github.com/mono/mono/pull/10880 --- .../shared/System/IO/Stream.cs | 32 ++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/System.Private.CoreLib/shared/System/IO/Stream.cs b/src/System.Private.CoreLib/shared/System/IO/Stream.cs index faeb69fb5..5243b48fc 100644 --- a/src/System.Private.CoreLib/shared/System/IO/Stream.cs +++ b/src/System.Private.CoreLib/shared/System/IO/Stream.cs @@ -25,6 +25,9 @@ using System.Threading.Tasks; namespace System.IO { +#if MONO + [Serializable] +#endif public abstract partial class Stream : MarshalByRefObject, IDisposable { public static readonly Stream Null = new NullStream(); @@ -35,8 +38,14 @@ namespace System.IO private const int DefaultCopyBufferSize = 81920; // To implement Async IO operations on streams that don't support async IO - +#if MONO + [NonSerialized] +#endif private ReadWriteTask _activeReadWriteTask; + +#if MONO + [NonSerialized] +#endif private SemaphoreSlim _asyncActiveSemaphore; internal SemaphoreSlim EnsureAsyncActiveSemaphoreInitialized() @@ -372,8 +381,9 @@ namespace System.IO else { byte[] sharedBuffer = ArrayPool.Shared.Rent(buffer.Length); - return FinishReadAsync(ReadAsync(sharedBuffer, 0, buffer.Length, cancellationToken), sharedBuffer, buffer); +#if !__MonoCS__ + return FinishReadAsync(ReadAsync(sharedBuffer, 0, buffer.Length, cancellationToken), sharedBuffer, buffer); async ValueTask FinishReadAsync(Task readTask, byte[] localBuffer, Memory localDestination) { try @@ -387,9 +397,27 @@ namespace System.IO ArrayPool.Shared.Return(localBuffer); } } +#else + return new ValueTask (FinishReadAsync(ReadAsync(sharedBuffer, 0, buffer.Length, cancellationToken), sharedBuffer, buffer)); +#endif } } +#if __MonoCS__ + internal async Task FinishReadAsync(Task readTask, byte[] localBuffer, Memory localDestination) + { + try + { + int result = await readTask.ConfigureAwait(false); + new Span(localBuffer, 0, result).CopyTo(localDestination.Span); + return result; + } + finally + { + ArrayPool.Shared.Return(localBuffer); + } + } +#endif private Task BeginEndReadAsync(byte[] buffer, int offset, int count) { if (!HasOverriddenBeginEndRead()) -- cgit v1.2.3