]> git.deb.at Git - rhonda/impostor.git/commitdiff
Improve BufferMessageReader, reduce complexity and slicing
authorAeonLucid <aeonlucid@gmail.com>
Thu, 15 Oct 2020 03:15:07 +0000 (05:15 +0200)
committerAeonLucid <aeonlucid@gmail.com>
Thu, 15 Oct 2020 03:15:07 +0000 (05:15 +0200)
src/Impostor.Server.Api/Net/Messages/IMessageReader.cs
src/Impostor.Server.Hazel/HazelConnection.cs
src/Impostor.Server.Hazel/HazelMatchmaker.cs
src/Impostor.Server.Hazel/Messages/BufferMessageReader.cs
src/Impostor.Server.Hazel/Messages/HazelConnectionMessageWriter.cs
src/Impostor.Server.Hazel/Messages/HazelGameMessageWriter.cs
src/Impostor.Server.Hazel/Messages/HazelMessage.cs
src/Impostor.Server.Hazel/Messages/HazelMessageWriter.cs
src/Impostor.Server/Net/Client.cs

index b080823660c7682d0afb06c39f8af31cb2d37a8a..aeefcc69992b216cad30b4c582cd9f7825f984c2 100644 (file)
@@ -5,9 +5,9 @@ namespace Impostor.Server.Net.Messages
     public interface IMessageReader
     {
         /// <summary>
-        ///     Gets the current position of the reader.
+        ///     Gets the tag of the message.
         /// </summary>
-        int Position { get; }
+        byte Tag { get; }
 
         /// <summary>
         ///     Gets the buffer of the message.
@@ -15,15 +15,17 @@ namespace Impostor.Server.Net.Messages
         ReadOnlyMemory<byte> Buffer { get; }
 
         /// <summary>
-        ///     Gets the tag of the message.
+        ///     Gets the current position of the reader.
         /// </summary>
-        byte Tag { get; }
+        int Position { get; }
 
         /// <summary>
         ///     Gets the length of the buffer.
         /// </summary>
         int Length { get; }
 
+        IMessageReader ReadMessage();
+
         bool ReadBoolean();
 
         sbyte ReadSByte();
@@ -51,5 +53,9 @@ namespace Impostor.Server.Net.Messages
         uint ReadPackedUInt32();
 
         void CopyTo(IMessageWriter writer);
+
+        IMessageReader Slice(int start);
+
+        IMessageReader Slice(int start, int length);
     }
 }
\ No newline at end of file
index da8273facef2471d12f5e61b665b43255d81bf5c..a8edb03711e3e21b3ade93b9afd26bbc80ab8313 100644 (file)
@@ -3,6 +3,7 @@ using System.Collections.Concurrent;
 using System.Net;
 using System.Threading.Tasks;
 using Hazel;
+using Impostor.Server.Hazel.Messages;
 using Impostor.Server.Net;
 using Impostor.Server.Net.Messages;
 using Microsoft.Extensions.Logging;
index 01c7c22d63af37fbe348198b3f05d412707b12df..b4f8fadcbbf9e83788126ce9a97c0b55291eace9 100644 (file)
@@ -5,6 +5,7 @@ using System.Threading.Tasks;
 using Hazel;
 using Hazel.Udp;
 using Impostor.Server.Games;
+using Impostor.Server.Hazel.Messages;
 using Impostor.Server.Net;
 using Impostor.Server.Net.Manager;
 using Impostor.Server.Net.Messages;
index 4ced4f3b78e4afec4b96e106ea0e96f5ca50d46c..5ff0fab41a18113d2b3a54125e1186ecf14b7bff 100644 (file)
@@ -1,41 +1,32 @@
 using System;
 using System.Runtime.CompilerServices;
 using System.Text;
-using Impostor.Server.Net;
 using Impostor.Server.Net.Messages;
 
-namespace Impostor.Server.Hazel
+namespace Impostor.Server.Hazel.Messages
 {
     public class BufferMessageReader : IMessageReader
     {
-        // TODO: Remove _offset, we can slice the buffer.
-        private readonly int _offset;
-        private int _position;
-        private int readHead;
-        
-        public ReadOnlyMemory<byte> Buffer { get; }
-        
         public byte Tag { get; }
+        public ReadOnlyMemory<byte> Buffer { get; }
+        public int Position { get; set; }
+        public int Length => Buffer.Length;
 
-        public int Length { get; }
-
-        public int Position
+        public BufferMessageReader(byte tag, ReadOnlyMemory<byte> buffer)
         {
-            get { return _position; }
-            set
-            {
-                _position = value;
-                readHead = value + _offset;
-            }
+            Tag = tag;
+            Buffer = buffer;
         }
 
-        public BufferMessageReader(byte tag, ReadOnlyMemory<byte> buffer, int offset, int length)
+        public IMessageReader ReadMessage()
         {
-            Tag = tag;
-            Buffer = buffer;
-            Length = length;
-            _offset = offset;
-            readHead = offset;
+            var length = ReadUInt16();
+            var tag = ReadByte();
+            var pos = Position;
+
+            Position += length;
+
+            return new BufferMessageReader(tag, Buffer.Slice(pos, length));
         }
 
         public bool ReadBoolean()
@@ -102,7 +93,7 @@ namespace Impostor.Server.Hazel
             // TODO: Refactor to System.Buffers.Binary.BinaryPrimitives
             
             float output = 0;
-            fixed (byte* bufPtr = &Buffer.Span[readHead])
+            fixed (byte* bufPtr = &Buffer.Span[Position])
             {
                 byte* outPtr = (byte*)&output;
 
@@ -119,7 +110,7 @@ namespace Impostor.Server.Hazel
         public string ReadString()
         {
             var len = ReadPackedInt32();
-            var output = Encoding.UTF8.GetString(Buffer.Span.Slice(readHead, len));
+            var output = Encoding.UTF8.GetString(Buffer.Span.Slice(Position, len));
             Position += len;
             return output;
         }
@@ -132,7 +123,7 @@ namespace Impostor.Server.Hazel
 
         public ReadOnlyMemory<byte> ReadBytes(int length)
         {
-            var output = Buffer.Slice(readHead, length);
+            var output = Buffer.Slice(Position, length);
             Position += length;
             return output;
         }
@@ -170,26 +161,25 @@ namespace Impostor.Server.Hazel
 
         public void CopyTo(IMessageWriter writer)
         {
-            int offset, length;
-            if (Tag == byte.MaxValue)
-            {
-                offset = _offset;
-                length = Length;
-            }
-            else
-            {
-                offset = _offset - 3;
-                length = Length + 3;
-            }
+            writer.Write((ushort) Length);
+            writer.Write((byte) Tag);
+            writer.Write(Buffer);
+        }
 
-            writer.Write(Buffer.Slice(offset, length));
+        public IMessageReader Slice(int start)
+        {
+            return new BufferMessageReader(Tag, Buffer.Slice(start));
+        }
+
+        public IMessageReader Slice(int start, int length)
+        {
+            return new BufferMessageReader(Tag, Buffer.Slice(start, length));
         }
 
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         private byte FastByte()
         {
-            _position++;
-            return Buffer.Span[readHead++];
+            return Buffer.Span[Position++];
         }
     }
 }
\ No newline at end of file
index 96f860122724b34cf3a92c821bf66451fb7059e5..3b06c50fbde1575c9296707615480b6730021635 100644 (file)
@@ -2,7 +2,7 @@
 using Impostor.Server.Net;
 using Impostor.Server.Net.Messages;
 
-namespace Impostor.Server.Hazel
+namespace Impostor.Server.Hazel.Messages
 {
     internal class HazelConnectionMessageWriter : HazelMessageWriter, IConnectionMessageWriter
     {
index 1f09ce73052f722b1914ec0e159709988a7f1d7c..e99533b71b17833ffbd5ae14f526e0d9865b3937 100644 (file)
@@ -6,9 +6,8 @@ using Hazel;
 using Impostor.Server.Games;
 using Impostor.Server.Net;
 using Impostor.Server.Net.Messages;
-using Impostor.Shared.Innersloth.Data;
 
-namespace Impostor.Server.Hazel
+namespace Impostor.Server.Hazel.Messages
 {
     internal class HazelGameMessageWriter : HazelMessageWriter, IGameMessageWriter
     {
index 70845c30518e6ccfc52b57854425a092aa7c1c4c..9339cb0d83871eda034eaa82721bf712adb3a800 100644 (file)
@@ -1,9 +1,8 @@
 using System;
 using Hazel;
-using Impostor.Server.Net;
 using Impostor.Server.Net.Messages;
 
-namespace Impostor.Server.Hazel
+namespace Impostor.Server.Hazel.Messages
 {
     internal class HazelMessage : IMessage, IDisposable
     {
@@ -25,7 +24,7 @@ namespace Impostor.Server.Hazel
                 throw new ObjectDisposedException(nameof(_reader));
             }
 
-            return new BufferMessageReader(_reader.Tag, _reader.Buffer, _reader.Offset, _reader.Length);
+            return new BufferMessageReader(_reader.Tag, _reader.Buffer.AsMemory(_reader.Offset, _reader.Length));
         }
 
         private void Dispose(bool disposing)
index da046f7b337434fd9fc81b87215298c95d9edc95..83147b44dd41c1fe90cc7a4abd98168b88034934 100644 (file)
@@ -2,10 +2,9 @@
 using System.Net;
 using Hazel;
 using Impostor.Server.Games;
-using Impostor.Server.Net;
 using Impostor.Server.Net.Messages;
 
-namespace Impostor.Server.Hazel
+namespace Impostor.Server.Hazel.Messages
 {
     internal abstract class HazelMessageWriter : IMessageWriter
     {
index 61ff3f882d35a0d111f46e31d48b013a22208aaa..42f9c913b144910808fc9c80f3af5d3d693c8e3f 100644 (file)
@@ -1,8 +1,10 @@
 using System;
 using System.Threading.Tasks;
+using Hazel;
 using Impostor.Server.Data;
 using Impostor.Server.Games;
 using Impostor.Server.Games.Managers;
+using Impostor.Server.Hazel.Messages;
 using Impostor.Server.Net.Manager;
 using Impostor.Server.Net.Messages;
 using Impostor.Shared.Innersloth;