From fbddaf8962681df86b8ab569801e50387aaf2bec Mon Sep 17 00:00:00 2001 From: lidgren Date: Wed, 21 May 2014 07:18:08 +0000 Subject: [PATCH] NetQueue.TryDequeue failure will now only throw in DEBUG WaitMessage will now create a wait event object if needed --- Lidgren.Network/NetPeer.cs | 13 ++++++++++--- Lidgren.Network/NetQueue.cs | 11 ++++++++++- UnitTests/Program.cs | 23 ++++++++++------------- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/Lidgren.Network/NetPeer.cs b/Lidgren.Network/NetPeer.cs index 547b872..da09586 100644 --- a/Lidgren.Network/NetPeer.cs +++ b/Lidgren.Network/NetPeer.cs @@ -14,6 +14,7 @@ namespace Lidgren.Network private int m_listenPort; private object m_tag; + private object m_messageReceivedEventCreationLock = new object(); internal readonly List m_connections; private readonly Dictionary m_connectionLookup; @@ -36,7 +37,13 @@ namespace Lidgren.Network get { if (m_messageReceivedEvent == null) - m_messageReceivedEvent = new AutoResetEvent(false); + { + lock (m_messageReceivedEventCreationLock) // make sure we don't create more than one event object + { + if (m_messageReceivedEvent == null) + m_messageReceivedEvent = new AutoResetEvent(false); + } + } return m_messageReceivedEvent; } } @@ -174,8 +181,8 @@ namespace Lidgren.Network var msg = ReadMessage(); if (msg != null) return msg; // no need to wait; we already have a message to deliver - if (m_messageReceivedEvent != null) - m_messageReceivedEvent.WaitOne(maxMillis); + var msgEvt = MessageReceivedEvent; + msgEvt.WaitOne(maxMillis); return ReadMessage(); } diff --git a/Lidgren.Network/NetQueue.cs b/Lidgren.Network/NetQueue.cs index 9f19e45..eb3411d 100644 --- a/Lidgren.Network/NetQueue.cs +++ b/Lidgren.Network/NetQueue.cs @@ -193,6 +193,15 @@ namespace Lidgren.Network return true; } + catch + { +#if DEBUG + throw; +#else + item = default(T); + return false; +#endif + } finally { m_lock.ExitWriteLock(); @@ -200,7 +209,7 @@ namespace Lidgren.Network } /// - /// Gets an item from the head of the queue, or returns default(T) if empty + /// Gets all items from the head of the queue, or returns number of items popped /// public int TryDrain(IList addTo) { diff --git a/UnitTests/Program.cs b/UnitTests/Program.cs index 47a1936..de6e14a 100644 --- a/UnitTests/Program.cs +++ b/UnitTests/Program.cs @@ -42,20 +42,17 @@ namespace UnitTests peer.Shutdown("bye"); // read all message - NetIncomingMessage inc; - while((inc = peer.ReadMessage()) != null) + NetIncomingMessage inc = peer.WaitMessage(5000); + switch(inc.MessageType) { - switch(inc.MessageType) - { - case NetIncomingMessageType.DebugMessage: - case NetIncomingMessageType.VerboseDebugMessage: - case NetIncomingMessageType.WarningMessage: - case NetIncomingMessageType.ErrorMessage: - Console.WriteLine("Peer message: " + inc.ReadString()); - break; - case NetIncomingMessageType.Error: - throw new Exception("Received error message!"); - } + case NetIncomingMessageType.DebugMessage: + case NetIncomingMessageType.VerboseDebugMessage: + case NetIncomingMessageType.WarningMessage: + case NetIncomingMessageType.ErrorMessage: + Console.WriteLine("Peer message: " + inc.ReadString()); + break; + case NetIncomingMessageType.Error: + throw new Exception("Received error message!"); } Console.WriteLine("Done");