コード例 #1
0
ファイル: ConnectionPreamble.cs プロジェクト: zpple/orleans
        private static void WriteLength(PrefixingBufferWriter <byte, PipeWriter> outputWriter, int length)
        {
            Span <byte> lengthSpan = stackalloc byte[4];

            BinaryPrimitives.WriteInt32LittleEndian(lengthSpan, length);
            outputWriter.Complete(lengthSpan);
        }
コード例 #2
0
        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());
        }
コード例 #3
0
        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;
        }
コード例 #4
0
ファイル: MessageSerializer.cs プロジェクト: zpple/orleans
        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);
        }
コード例 #5
0
        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;
        }