NetworkComms.Net
NetworkComms.Net copied to clipboard
Dead lock with bad locking.
SendPacket can cause RemoveConnectionReference and AddConnectionReference can call SendPacket. The first takes sendLocker then globalDictAndDelegateLocker, the second takes them in reverse.
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.Connections.Connection.SendPacket<byte[]>(NetworkCommsDotNet.IPacket packet, out long packetSequenceNumber) Line 527
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.Connections.Connection.SendReceiveObject<byte[], byte[]>(string sendingPacketTypeStr, string expectedReturnPacketTypeStr, int returnPacketTimeOutMilliSeconds, byte[] sendObject, NetworkCommsDotNet.SendReceiveOptions sendOptions, NetworkCommsDotNet.SendReceiveOptions receiveOptions, out long sentPacketSequenceNumber) Line 256
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.Connections.Connection.ConnectionAlive(int aliveRespondTimeoutMS, out long responseTimeMS) Line 474
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.Connections.Connection.ConnectionAlive() Line 428
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.NetworkComms.AddConnectionReferenceByRemoteEndPoint(NetworkCommsDotNet.Connections.Connection connection, System.Net.EndPoint remoteEndPointToUse, System.Net.EndPoint localEndPointToUse) Line 1897
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.NetworkComms.UpdateConnectionReferenceByEndPoint(NetworkCommsDotNet.Connections.Connection connection, System.Net.EndPoint newRemoteEndPoint, System.Net.EndPoint newLocalEndPoint) Line 1985
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.Connections.Connection.ConnectionSetupHandlerFinal(NetworkCommsDotNet.ConnectionInfo remoteConnectionInfo, ref bool possibleClashWithExistingConnection, ref NetworkCommsDotNet.Connections.Connection existingConnection) Line 488
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.Connections.Connection.ConnectionSetupHandler(System.IO.MemoryStream packetDataSection) Line 343
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.NetworkComms.CompleteIncomingItemTask(object priorityQueueItemObj) Line 334
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.Connections.Connection.IncomingPacketHandleHandOff(NetworkCommsDotNet.Tools.PacketBuilder packetBuilder) Line 163
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.Connections.TCP.TCPConnection.IncomingTCPPacketHandler(System.IAsyncResult ar) Line 405
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.NetworkComms.RemoveConnectionReference(NetworkCommsDotNet.Connections.Connection connection, bool maintainConnectionInfoHistory) Line 1809
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.Connections.Connection.CloseConnection(bool closeDueToError, int logLocation) Line 369
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.Connections.Connection.SendPacket<object>(NetworkCommsDotNet.IPacket packet, out long packetSequenceNumber) Line 659
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.Connections.Connection.SendReceiveObject<object, string[]>(string sendingPacketTypeStr, string expectedReturnPacketTypeStr, int returnPacketTimeOutMilliSeconds, object sendObject, NetworkCommsDotNet.SendReceiveOptions sendOptions, NetworkCommsDotNet.SendReceiveOptions receiveOptions, out long sentPacketSequenceNumber) Line 256
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.Connections.Connection.SendReceiveObject<object, string[]>(string sendingPacketTypeStr, string expectedReturnPacketTypeStr, int returnPacketTimeOutMilliSeconds, object sendObject, NetworkCommsDotNet.SendReceiveOptions sendOptions, NetworkCommsDotNet.SendReceiveOptions receiveOptions) Line 201
NetworkCommsDotNetComplete.dll!NetworkCommsDotNet.Connections.Connection.SendReceiveObject<string[]>(string sendingPacketTypeStr, string expectedReturnPacketTypeStr, int returnPacketTimeOutMilliSeconds) Line 298
Good spot! If you would be willing to raise a PR for this I'd happily merge it in.