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();