private static void WriteLength(PrefixingBufferWriter <byte, PipeWriter> outputWriter, int length) { Span <byte> lengthSpan = stackalloc byte[4]; BinaryPrimitives.WriteInt32LittleEndian(lengthSpan, length); outputWriter.Complete(lengthSpan); }
internal static Task Write(ConnectionContext connection, GrainId grainId, SiloAddress siloAddress) { var output = connection.Transport.Output; var outputWriter = new PrefixingBufferWriter <byte, PipeWriter>(output, sizeof(int), 1024, MemoryPool <byte> .Shared); var writer = new BinaryTokenStreamWriter2 <PrefixingBufferWriter <byte, PipeWriter> >(outputWriter); writer.Write(grainId); if (!(siloAddress is null)) { writer.Write(siloAddress); } writer.Commit(); var length = outputWriter.CommittedBytes; if (length > MaxPreambleLength) { throw new InvalidOperationException($"Created preamble of length {length}, which is greater than maximum allowed size of {MaxPreambleLength}."); } Span <byte> lengthSpan = stackalloc byte[4]; BinaryPrimitives.WriteInt32LittleEndian(lengthSpan, length); outputWriter.Complete(lengthSpan); var flushTask = output.FlushAsync(); if (flushTask.IsCompletedSuccessfully) { return(Task.CompletedTask); } return(flushTask.AsTask()); }
internal async ValueTask Write(ConnectionContext connection, ConnectionPreamble preamble) { var output = connection.Transport.Output; using var outputWriter = new PrefixingBufferWriter <byte, PipeWriter>(sizeof(int), 1024, MemoryPool <byte> .Shared); outputWriter.Reset(output); _preambleSerializer.Serialize( preamble, outputWriter); var length = outputWriter.CommittedBytes; if (length > MaxPreambleLength) { throw new InvalidOperationException($"Created preamble of length {length}, which is greater than maximum allowed size of {MaxPreambleLength}."); } WriteLength(outputWriter, length); var flushResult = await output.FlushAsync(); if (flushResult.IsCanceled) { throw new OperationCanceledException("Flush canceled"); } return; }
public void Write <TBufferWriter>(ref TBufferWriter writer, Message message) where TBufferWriter : IBufferWriter <byte> { var buffer = new PrefixingBufferWriter <byte, TBufferWriter>(writer, 8, 4096, this.memoryPool); Span <byte> lengthFields = stackalloc byte[8]; this.headersSerializer.Serialize(buffer, message.Headers); var headerLength = buffer.CommittedBytes; this.objectSerializer.Serialize(buffer, message.BodyObject); // Write length prefixes, first header length then body length. BinaryPrimitives.WriteInt32LittleEndian(lengthFields, headerLength); var bodyLength = buffer.CommittedBytes - headerLength; BinaryPrimitives.WriteInt32LittleEndian(lengthFields.Slice(4), bodyLength); buffer.Complete(lengthFields); }
internal static async System.Threading.Tasks.ValueTask Write(ConnectionContext connection, GrainId nodeIdentity, NetworkProtocolVersion protocolVersion, SiloAddress siloAddress) { var output = connection.Transport.Output; var outputWriter = new PrefixingBufferWriter <byte, PipeWriter>(sizeof(int), 1024, MemoryPool <byte> .Shared); outputWriter.Reset(output); var writer = new BinaryTokenStreamWriter2 <PrefixingBufferWriter <byte, PipeWriter> >(outputWriter); writer.Write(nodeIdentity); writer.Write((byte)protocolVersion); if (siloAddress is null) { writer.WriteNull(); } else { writer.Write((byte)SerializationTokenType.SiloAddress); writer.Write(siloAddress); } writer.Commit(); var length = outputWriter.CommittedBytes; if (length > MaxPreambleLength) { throw new InvalidOperationException($"Created preamble of length {length}, which is greater than maximum allowed size of {MaxPreambleLength}."); } WriteLength(outputWriter, length); var flushResult = await output.FlushAsync(); if (flushResult.IsCanceled) { throw new OperationCanceledException("Flush canceled"); } return; }