From 49c5e80436e76f1eae834f0e9579a2655e96af3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20K=C3=B6llner?= Date: Sat, 22 Feb 2020 22:06:23 +0100 Subject: [PATCH] avoid multimodal timing effects --- Benchmarking/Benchmark/Benchmark.csproj | 2 +- .../EchoServiceCapnp/EchoServiceCapnp.csproj | 2 +- Capnp.Net.Runtime/Util/DuplexBufferedStream.cs | 17 ++++++++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Benchmarking/Benchmark/Benchmark.csproj b/Benchmarking/Benchmark/Benchmark.csproj index 4e9e87a..dd945db 100644 --- a/Benchmarking/Benchmark/Benchmark.csproj +++ b/Benchmarking/Benchmark/Benchmark.csproj @@ -7,7 +7,7 @@ - + diff --git a/Benchmarking/EchoServiceCapnp/EchoServiceCapnp.csproj b/Benchmarking/EchoServiceCapnp/EchoServiceCapnp.csproj index 9f52ec0..eabdfbe 100644 --- a/Benchmarking/EchoServiceCapnp/EchoServiceCapnp.csproj +++ b/Benchmarking/EchoServiceCapnp/EchoServiceCapnp.csproj @@ -6,7 +6,7 @@ - + diff --git a/Capnp.Net.Runtime/Util/DuplexBufferedStream.cs b/Capnp.Net.Runtime/Util/DuplexBufferedStream.cs index 05bc69a..11e3f06 100644 --- a/Capnp.Net.Runtime/Util/DuplexBufferedStream.cs +++ b/Capnp.Net.Runtime/Util/DuplexBufferedStream.cs @@ -5,14 +5,22 @@ namespace Capnp.Util { internal class DuplexBufferedStream : Stream { + const int DefaultBufferSize = 4096; + readonly BufferedStream _readStream; readonly BufferedStream _writeStream; + readonly int _bufferSize; readonly object _reentrancyBlocker = new object(); - public DuplexBufferedStream(Stream stream) + public DuplexBufferedStream(Stream stream, int bufferSize) + { + _readStream = new BufferedStream(stream, bufferSize); + _writeStream = new BufferedStream(stream, bufferSize); + _bufferSize = bufferSize; + } + + public DuplexBufferedStream(Stream stream): this(stream, DefaultBufferSize) { - _readStream = new BufferedStream(stream); - _writeStream = new BufferedStream(stream); } public override bool CanRead => true; @@ -51,6 +59,9 @@ namespace Capnp.Util public override void Write(byte[] buffer, int offset, int count) { + if (buffer.Length > _bufferSize) // avoid moiré-like timing effects + _writeStream.Flush(); + _writeStream.Write(buffer, offset, count); }