fix: Tidy up socket dispose. (#1334)
This commit is contained in:
parent
14ef1ab7e5
commit
44c69620a6
3 changed files with 46 additions and 48 deletions
|
|
@ -1091,6 +1091,12 @@ public partial class NetState : IComparable<NetState>
|
|||
}
|
||||
#endif
|
||||
|
||||
var m = Mobile;
|
||||
if (m?.NetState == this)
|
||||
{
|
||||
m.NetState = null;
|
||||
}
|
||||
|
||||
TcpServer.Instances.Remove(this);
|
||||
try
|
||||
{
|
||||
|
|
@ -1104,14 +1110,8 @@ public partial class NetState : IComparable<NetState>
|
|||
Connection.Close();
|
||||
_handle.Free();
|
||||
|
||||
var m = Mobile;
|
||||
Mobile = null;
|
||||
|
||||
if (m?.NetState == this)
|
||||
{
|
||||
m.NetState = null;
|
||||
}
|
||||
|
||||
var a = Account;
|
||||
|
||||
Gumps.Clear();
|
||||
|
|
@ -1120,6 +1120,7 @@ public partial class NetState : IComparable<NetState>
|
|||
Account = null;
|
||||
ServerInfo = null;
|
||||
CityInfo = null;
|
||||
Connection = null;
|
||||
|
||||
var count = TcpServer.Instances.Count;
|
||||
|
||||
|
|
|
|||
|
|
@ -5,5 +5,9 @@ namespace Server.Network;
|
|||
public static class OutgoingPackets
|
||||
{
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static bool CannotSendPackets(this NetState ns) => ns?.Connection == null || ns.BlockAllPackets;
|
||||
public static bool CannotSendPackets(this NetState ns) =>
|
||||
// Do not check for NetState.Running. Packets are sent to a "disconnected" socket as part of the OnDisconnect events
|
||||
// up until the Connection is nulled. Closing the connection is done synchronously, therefore packets will not be sent
|
||||
// once the Mobile.NetState is null.
|
||||
ns?.Connection == null || ns.BlockAllPackets;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ using System.IO;
|
|||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
using Microsoft.Toolkit.HighPerformance;
|
||||
|
|
@ -1455,74 +1456,66 @@ public static class Utility
|
|||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static bool Remove<T>(ref List<T> list, T value)
|
||||
{
|
||||
if (list != null)
|
||||
if (list?.Remove(value) != true)
|
||||
{
|
||||
var removed = list.Remove(value);
|
||||
|
||||
if (list.Count == 0)
|
||||
{
|
||||
list = null;
|
||||
}
|
||||
|
||||
return removed;
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
if (list.Count == 0)
|
||||
{
|
||||
list = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static bool Remove<T>(ref HashSet<T> set, T value)
|
||||
{
|
||||
if (set != null)
|
||||
if (set?.Remove(value) != true)
|
||||
{
|
||||
var removed = set.Remove(value);
|
||||
|
||||
if (set.Count == 0)
|
||||
{
|
||||
set = null;
|
||||
}
|
||||
|
||||
return removed;
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
if (set.Count == 0)
|
||||
{
|
||||
set = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static bool Remove<K, V>(ref Dictionary<K, V> dict, K key)
|
||||
{
|
||||
if (dict != null)
|
||||
if (dict?.Remove(key) != true)
|
||||
{
|
||||
var removed = dict.Remove(key);
|
||||
|
||||
if (dict.Count == 0)
|
||||
{
|
||||
dict = null;
|
||||
}
|
||||
|
||||
return removed;
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
if (dict.Count == 0)
|
||||
{
|
||||
dict = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static bool Remove<K, V>(ref Dictionary<K, V> dict, K key, out V value)
|
||||
{
|
||||
if (dict != null)
|
||||
if (dict?.Remove(key, out value) != true)
|
||||
{
|
||||
var removed = dict.Remove(key, out value);
|
||||
|
||||
if (dict.Count == 0)
|
||||
{
|
||||
dict = null;
|
||||
}
|
||||
|
||||
return removed;
|
||||
value = default;
|
||||
return false;
|
||||
}
|
||||
|
||||
value = default;
|
||||
return false;
|
||||
if (dict.Count == 0)
|
||||
{
|
||||
dict = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue