diff --git a/src/Tgstation.Server.Host/IO/BufferedFileStreamProvider.cs b/src/Tgstation.Server.Host/IO/BufferedFileStreamProvider.cs index a233b937c3..a92e28f998 100644 --- a/src/Tgstation.Server.Host/IO/BufferedFileStreamProvider.cs +++ b/src/Tgstation.Server.Host/IO/BufferedFileStreamProvider.cs @@ -62,12 +62,13 @@ namespace Tgstation.Server.Host.IO lock (semaphore) { localBuffer = buffer; - if (localBuffer == null) + if (buffered && localBuffer == null) return; // important to drop the reference so it can properly GC // The implementation of MemoryStream doesn't fucking do this for some reason buffer = null; + buffered = true; } var bufferDispose = localBuffer.DisposeAsync(); @@ -77,6 +78,24 @@ namespace Tgstation.Server.Host.IO /// public async Task GetResult(CancellationToken cancellationToken) + { + var (sharedStream, _) = await GetResultInternal(cancellationToken); + return sharedStream; + } + + /// + public async Task GetOwnedResult(CancellationToken cancellationToken) + { + var (sharedStream, length) = await GetResultInternal(cancellationToken); + return new MemoryStream(sharedStream.GetBuffer(), 0, (int)length, false, true); + } + + /// + /// Gets the shared and its . + /// + /// The for the operation. + /// A resulting in and its . + async Task<(MemoryStream, long)> GetResultInternal(CancellationToken cancellationToken) { if (!buffered) using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken)) @@ -89,19 +108,14 @@ namespace Tgstation.Server.Host.IO throw new ObjectDisposedException(nameof(BufferedFileStreamProvider)); buffer.Seek(0, SeekOrigin.Begin); + buffered = true; + return (buffer, buffer.Length); } - - buffered = true; } - return buffer ?? throw new ObjectDisposedException(nameof(BufferedFileStreamProvider)); - } - - /// - public async Task GetOwnedResult(CancellationToken cancellationToken) - { - var sharedStream = (MemoryStream)await GetResult(cancellationToken); - return new MemoryStream(sharedStream.GetBuffer(), 0, (int)sharedStream.Length, false, true); + return ( + buffer ?? throw new ObjectDisposedException(nameof(BufferedFileStreamProvider)), + buffer.Length); } } }