avoid multimodal timing effects

This commit is contained in:
Christian Köllner 2020-02-22 22:06:23 +01:00
parent 7b16dbd6e9
commit 49c5e80436
3 changed files with 16 additions and 5 deletions

View File

@ -7,7 +7,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.12.0" /> <PackageReference Include="BenchmarkDotNet" Version="0.12.0" />
<PackageReference Include="Capnp.Net.Runtime" Version="1.3.23-g5e71ce69c5" /> <PackageReference Include="Capnp.Net.Runtime" Version="1.3.31-g7b16dbd6e9" />
<PackageReference Include="CapnpC.CSharp.MsBuild.Generation" Version="1.2.138" /> <PackageReference Include="CapnpC.CSharp.MsBuild.Generation" Version="1.2.138" />
<PackageReference Include="Google.Protobuf" Version="3.11.3" /> <PackageReference Include="Google.Protobuf" Version="3.11.3" />
<PackageReference Include="Grpc.Net.Client" Version="2.27.0" /> <PackageReference Include="Grpc.Net.Client" Version="2.27.0" />

View File

@ -6,7 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Capnp.Net.Runtime" Version="1.3.23-g5e71ce69c5" /> <PackageReference Include="Capnp.Net.Runtime" Version="1.3.31-g7b16dbd6e9" />
<PackageReference Include="CapnpC.CSharp.MsBuild.Generation" Version="1.2.138" /> <PackageReference Include="CapnpC.CSharp.MsBuild.Generation" Version="1.2.138" />
</ItemGroup> </ItemGroup>

View File

@ -5,14 +5,22 @@ namespace Capnp.Util
{ {
internal class DuplexBufferedStream : Stream internal class DuplexBufferedStream : Stream
{ {
const int DefaultBufferSize = 4096;
readonly BufferedStream _readStream; readonly BufferedStream _readStream;
readonly BufferedStream _writeStream; readonly BufferedStream _writeStream;
readonly int _bufferSize;
readonly object _reentrancyBlocker = new object(); 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; public override bool CanRead => true;
@ -51,6 +59,9 @@ namespace Capnp.Util
public override void Write(byte[] buffer, int offset, int count) 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); _writeStream.Write(buffer, offset, count);
} }