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()); }
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); }