From c6e93a68140052e9c2015c9f55db0d5045703048 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Mon, 1 Feb 2021 20:37:51 -0800 Subject: [PATCH] fix(core): Fixes a few netstate issues (#436) - [X] Fixes the order of disconnect/dispose - [X] Removes IsDisposing --- Projects/Server/Mobiles/Mobile.cs | 10 ++++++- Projects/Server/Network/NetState/NetState.cs | 22 ++++++--------- Projects/Server/Network/TcpServer.cs | 28 ++++++++++---------- 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/Projects/Server/Mobiles/Mobile.cs b/Projects/Server/Mobiles/Mobile.cs index 438512eb8..c5faf0ef1 100644 --- a/Projects/Server/Mobiles/Mobile.cs +++ b/Projects/Server/Mobiles/Mobile.cs @@ -1445,7 +1445,15 @@ namespace Server [CommandProperty(AccessLevel.GameMaster, AccessLevel.Owner)] public NetState NetState { - get => m_NetState?.Connection != null && !m_NetState.IsDisposing ? m_NetState : null; + get + { + if (m_NetState?.Connection == null) + { + m_NetState = null; + } + + return m_NetState; + } set { if (m_NetState != value) diff --git a/Projects/Server/Network/NetState/NetState.cs b/Projects/Server/Network/NetState/NetState.cs index ec6ad7c76..0b333abfd 100644 --- a/Projects/Server/Network/NetState/NetState.cs +++ b/Projects/Server/Network/NetState/NetState.cs @@ -50,15 +50,12 @@ namespace Server.Network public static NetStateCreatedCallback CreatedCallback { get; set; } private readonly string _toString; - private int _disposing; private ClientVersion _version; - private byte[] _recvBuffer; - private byte[] _sendBuffer; private long _nextActivityCheck; private volatile bool _running; private volatile DecodePacket _packetDecoder; private volatile EncodePacket _packetEncoder; - private bool _flushQueued = false; + private bool _flushQueued; internal int _authId; internal int _seed; @@ -87,10 +84,10 @@ namespace Server.Network HuePickers = new List(); Menus = new List(); Trades = new List(); - _recvBuffer = GC.AllocateUninitializedArray(RecvPipeSize); - RecvPipe = new Pipe(_recvBuffer); - _sendBuffer = GC.AllocateUninitializedArray(SendPipeSize); - SendPipe = new Pipe(_sendBuffer); + var recvBuffer = GC.AllocateUninitializedArray(RecvPipeSize); + RecvPipe = new Pipe(recvBuffer); + var sendBuffer = GC.AllocateUninitializedArray(SendPipeSize); + SendPipe = new Pipe(sendBuffer); _nextActivityCheck = Core.TickCount + 30000; try @@ -164,8 +161,6 @@ namespace Server.Network public IAccount Account { get; set; } - public bool IsDisposing => _disposing != 0; - public int CompareTo(NetState other) => string.CompareOrdinal(_toString, other?._toString); public void ValidateAllTrades() @@ -751,12 +746,12 @@ namespace Server.Network public virtual void Dispose() { - if (Connection == null || Interlocked.CompareExchange(ref _disposing, 1, 0) == 1) + if (Connection == null || !_running) { return; } - SendPipe.Writer.Close(); + _running = false; try { @@ -781,11 +776,10 @@ namespace Server.Network private void Disconnect() { - _running = false; Connection = null; RecvPipe.Writer.Flush(); - RecvPipe.Writer.Close(); + SendPipe.Writer.Close(); var m = Mobile; var a = Account; diff --git a/Projects/Server/Network/TcpServer.cs b/Projects/Server/Network/TcpServer.cs index 2ad87c4ff..307605201 100644 --- a/Projects/Server/Network/TcpServer.cs +++ b/Projects/Server/Network/TcpServer.cs @@ -26,22 +26,22 @@ namespace Server.Network { public static class TcpServer { - private static NetworkState m_NetworkState = NetworkState.ResumeState; + private static NetworkState _networkState = NetworkState.ResumeState; // Sanity. 256 * 1024 * 5000 = ~1.3GB of ram - public static int MaxConnections { get; set; } = 5000; + public static int MaxConnections { get; set; } = 4096; private const long _listenerErrorMessageDelay = 10000; // 10 seconds private static long _nextMaximumSocketsReachedMessage; // AccountLoginReject BadComm - private static readonly byte[] socketRejected = { 0x82, 0xFF }; + private static readonly byte[] _socketRejected = { 0x82, 0xFF }; public static IPEndPoint[] ListeningAddresses { get; private set; } public static TcpListener[] Listeners { get; private set; } - public static HashSet Instances { get; } = new(128); + public static HashSet Instances { get; } = new(2048); - public static ConcurrentQueue m_ConnectedQueue = new(); + private static readonly ConcurrentQueue _connectedQueue = new(); public static void Configure() { @@ -128,7 +128,7 @@ namespace Server.Network */ public static void Pause() { - NetworkState.Pause(ref m_NetworkState); + NetworkState.Pause(ref _networkState); } /** @@ -137,7 +137,7 @@ namespace Server.Network */ public static void Resume() { - if (!NetworkState.Resume(ref m_NetworkState)) + if (!NetworkState.Resume(ref _networkState)) { return; } @@ -154,11 +154,11 @@ namespace Server.Network public static int Slice() { int count = 0; - var limit = m_ConnectedQueue.Count; + var limit = _connectedQueue.Count; - while (m_ConnectedQueue.Count > 0 && --limit >= 0) + while (_connectedQueue.Count > 0 && --limit >= 0) { - if (!m_ConnectedQueue.TryDequeue(out var ns)) + if (!_connectedQueue.TryDequeue(out var ns)) { break; } @@ -175,7 +175,7 @@ namespace Server.Network { while (true) { - if (m_NetworkState.Paused) + if (_networkState.Paused) { return; } @@ -187,7 +187,7 @@ namespace Server.Network socket = await listener.AcceptSocketAsync().ConfigureAwait(false); if (Instances.Count >= MaxConnections) { - socket.Send(socketRejected, SocketFlags.None); + socket.Send(_socketRejected, SocketFlags.None); socket.Shutdown(SocketShutdown.Both); socket.Close(); throw new MaxConnectionsException(); @@ -198,7 +198,7 @@ namespace Server.Network if (!args.AllowConnection) { - socket.Send(socketRejected, SocketFlags.None); + socket.Send(_socketRejected, SocketFlags.None); socket.Shutdown(SocketShutdown.Both); socket.Close(); } @@ -222,7 +222,7 @@ namespace Server.Network } var ns = new NetState(new NetworkSocket(socket)); - m_ConnectedQueue.Enqueue(ns); + _connectedQueue.Enqueue(ns); ns.Start(); } }