diff --git a/Lidgren.Network/NetConnection.cs b/Lidgren.Network/NetConnection.cs index 6afd535..03eb06a 100644 --- a/Lidgren.Network/NetConnection.cs +++ b/Lidgren.Network/NetConnection.cs @@ -228,8 +228,8 @@ namespace Lidgren.Network if (m_throttleDebt >= throttleThreshold) break; - NetSending send = m_unsentMessages.TryDequeue(); - if (send == null) + NetSending send; + if (!m_unsentMessages.TryDequeue(out send)) continue; send.NumSends++; diff --git a/Lidgren.Network/NetPeer.Internal.cs b/Lidgren.Network/NetPeer.Internal.cs index 0e92b57..48dabd5 100644 --- a/Lidgren.Network/NetPeer.Internal.cs +++ b/Lidgren.Network/NetPeer.Internal.cs @@ -233,7 +233,7 @@ namespace Lidgren.Network // send unconnected sends NetSending uncSend; - while ((uncSend = m_unsentUnconnectedMessage.TryDequeue()) != null) + while (m_unsentUnconnectedMessage.TryDequeue(out uncSend)) { // // TODO: use throttling here diff --git a/Lidgren.Network/NetPeer.Recycling.cs b/Lidgren.Network/NetPeer.Recycling.cs index 674b9b9..1578b0d 100644 --- a/Lidgren.Network/NetPeer.Recycling.cs +++ b/Lidgren.Network/NetPeer.Recycling.cs @@ -81,11 +81,11 @@ namespace Lidgren.Network /// initial capacity in bytes public NetOutgoingMessage CreateMessage(int initialCapacity) { - NetOutgoingMessage retval = m_outgoingMessagesPool.TryDequeue(); - if (retval == null) - retval = new NetOutgoingMessage(); - else + NetOutgoingMessage retval; + if (m_outgoingMessagesPool.TryDequeue(out retval)) retval.Reset(); + else + retval = new NetOutgoingMessage(); byte[] storage = GetStorage(initialCapacity); retval.m_data = storage; @@ -228,11 +228,11 @@ namespace Lidgren.Network /// internal NetIncomingMessage CreateIncomingMessage(NetIncomingMessageType tp, int requiredCapacity) { - NetIncomingMessage retval = m_incomingMessagesPool.TryDequeue(); - if (retval == null) - retval = new NetIncomingMessage(); - else + NetIncomingMessage retval; + if (m_incomingMessagesPool.TryDequeue(out retval)) retval.Reset(); + else + retval = new NetIncomingMessage(); NetException.Assert(retval.m_status == NetIncomingMessageReleaseStatus.NotReleased); @@ -256,11 +256,11 @@ namespace Lidgren.Network internal NetIncomingMessage CreateIncomingMessage(NetIncomingMessageType tp, byte[] copyFrom, int offset, int copyLength) { - NetIncomingMessage retval = m_incomingMessagesPool.TryDequeue(); - if (retval == null) - retval = new NetIncomingMessage(); - else + NetIncomingMessage retval; + if (m_incomingMessagesPool.TryDequeue(out retval)) retval.Reset(); + else + retval = new NetIncomingMessage(); NetException.Assert(retval.m_status == NetIncomingMessageReleaseStatus.NotReleased); diff --git a/Lidgren.Network/NetPeer.cs b/Lidgren.Network/NetPeer.cs index f4537a1..c8a0602 100644 --- a/Lidgren.Network/NetPeer.cs +++ b/Lidgren.Network/NetPeer.cs @@ -196,8 +196,8 @@ namespace Lidgren.Network if (m_status == NetPeerStatus.NotRunning) return null; - NetIncomingMessage retval = m_releasedIncomingMessages.TryDequeue(); - if (retval != null) + NetIncomingMessage retval; + if (m_releasedIncomingMessages.TryDequeue(out retval)) { if (retval.MessageType == NetIncomingMessageType.StatusChanged) { @@ -212,7 +212,9 @@ namespace Lidgren.Network { if (m_messageReceivedEvent != null) m_messageReceivedEvent.WaitOne(maxMillis); - return m_releasedIncomingMessages.TryDequeue(); + NetIncomingMessage retval; + m_releasedIncomingMessages.TryDequeue(out retval); + return retval; } /// diff --git a/Lidgren.Network/NetQueue.cs b/Lidgren.Network/NetQueue.cs index e90817b..f23379b 100644 --- a/Lidgren.Network/NetQueue.cs +++ b/Lidgren.Network/NetQueue.cs @@ -133,23 +133,29 @@ namespace Lidgren.Network /// /// Gets an item from the head of the queue, or returns default(T) if empty /// - public T TryDequeue() + public bool TryDequeue(out T item) { if (m_size == 0) - return default(T); + { + item = default(T); + return false; + } lock (m_lock) { if (m_size == 0) - return default(T); + { + item = default(T); + return false; + } - T retval = m_items[m_head]; + item = m_items[m_head]; m_items[m_head] = default(T); m_head = (m_head + 1) % m_items.Length; m_size--; - return retval; + return true; } } diff --git a/UnitTests/NetQueueTests.cs b/UnitTests/NetQueueTests.cs index 229feed..8be4c9e 100644 --- a/UnitTests/NetQueueTests.cs +++ b/UnitTests/NetQueueTests.cs @@ -14,6 +14,9 @@ namespace UnitTests queue.Enqueue(2); queue.Enqueue(3); + bool ok; + int a; + if (queue.Contains(4)) throw new Exception("NetQueue Contains failure"); @@ -22,8 +25,11 @@ namespace UnitTests if (queue.Count != 3) throw new Exception("NetQueue failed"); - if (queue.TryDequeue() != 1) + + ok = queue.TryDequeue(out a); + if (ok == false || a != 1) throw new Exception("NetQueue failure"); + if (queue.Count != 2) throw new Exception("NetQueue failed"); @@ -31,22 +37,32 @@ namespace UnitTests if (queue.Count != 3) throw new Exception("NetQueue failed"); - if (queue.TryDequeue() != 42) + ok = queue.TryDequeue(out a); + if (ok == false || a != 42) throw new Exception("NetQueue failed"); - if (queue.TryDequeue() != 2) + + ok = queue.TryDequeue(out a); + if (ok == false || a != 2) throw new Exception("NetQueue failed"); - if (queue.TryDequeue() != 3) + + ok = queue.TryDequeue(out a); + if (ok == false || a != 3) throw new Exception("NetQueue failed"); - if (queue.TryDequeue() != 0) + + ok = queue.TryDequeue(out a); + if (ok == true) throw new Exception("NetQueue failed"); - if (queue.TryDequeue() != 0) + + ok = queue.TryDequeue(out a); + if (ok == true) throw new Exception("NetQueue failed"); queue.Enqueue(78); if (queue.Count != 1) throw new Exception("NetQueue failed"); - if (queue.TryDequeue() != 78) + ok = queue.TryDequeue(out a); + if (ok == false || a != 78) throw new Exception("NetQueue failed"); queue.Clear();