* Clarified what FireQueueEmpty is doing with a MIN_CALLBACK_MS constant and upped it to 30ms

* Removed the unused PacketSent() function
* Switched UnackedPacketCollection from a SortedDictionary to a Dictionary now that the sorting is no longer needed. Big performance improvement for ResendUnacked()
prioritization
John Hurliman 2009-10-21 17:02:55 -07:00
parent 2b39ff0a39
commit 4e04f6b3a5
4 changed files with 8 additions and 18 deletions

View File

@ -531,11 +531,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// as an object to match the WaitCallback delegate signature</param> /// as an object to match the WaitCallback delegate signature</param>
private void FireQueueEmpty(object o) private void FireQueueEmpty(object o)
{ {
const int MIN_CALLBACK_MS = 30;
int i = (int)o; int i = (int)o;
ThrottleOutPacketType type = (ThrottleOutPacketType)i; ThrottleOutPacketType type = (ThrottleOutPacketType)i;
QueueEmpty callback = OnQueueEmpty; QueueEmpty callback = OnQueueEmpty;
int start = Environment.TickCount; int start = Environment.TickCount & Int32.MaxValue;
if (callback != null) if (callback != null)
{ {
@ -543,10 +545,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
catch (Exception e) { m_log.Error("[LLUDPCLIENT]: OnQueueEmpty(" + type + ") threw an exception: " + e.Message, e); } catch (Exception e) { m_log.Error("[LLUDPCLIENT]: OnQueueEmpty(" + type + ") threw an exception: " + e.Message, e); }
} }
// Make sure all queue empty calls take at least a measurable amount of time, // Make sure all queue empty calls take at least some amount of time,
// otherwise we'll peg a CPU trying to fire these too fast // otherwise we'll peg a CPU trying to fire these too fast
if (Environment.TickCount == start) int elapsedMS = (Environment.TickCount & Int32.MaxValue) - start;
System.Threading.Thread.Sleep((int)m_udpServer.TickCountResolution); if (elapsedMS < MIN_CALLBACK_MS)
System.Threading.Thread.Sleep(MIN_CALLBACK_MS - elapsedMS);
m_onQueueEmptyRunning[i] = false; m_onQueueEmptyRunning[i] = false;
} }

View File

@ -674,10 +674,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
packetInbox.Enqueue(new IncomingPacket(udpClient, packet)); packetInbox.Enqueue(new IncomingPacket(udpClient, packet));
} }
protected override void PacketSent(UDPPacketBuffer buffer, int bytesSent)
{
}
private void SendAckImmediate(IPEndPoint remoteEndpoint, uint sequenceNumber) private void SendAckImmediate(IPEndPoint remoteEndpoint, uint sequenceNumber)
{ {
PacketAckPacket ack = new PacketAckPacket(); PacketAckPacket ack = new PacketAckPacket();

View File

@ -46,13 +46,6 @@ namespace OpenMetaverse
/// <param name="buffer">Incoming packet buffer</param> /// <param name="buffer">Incoming packet buffer</param>
protected abstract void PacketReceived(UDPPacketBuffer buffer); protected abstract void PacketReceived(UDPPacketBuffer buffer);
/// <summary>
/// This method is called when an outgoing packet is sent
/// </summary>
/// <param name="buffer">Outgoing packet buffer</param>
/// <param name="bytesSent">Number of bytes written to the wire</param>
protected abstract void PacketSent(UDPPacketBuffer buffer, int bytesSent);
/// <summary>UDP port to bind to in server mode</summary> /// <summary>UDP port to bind to in server mode</summary>
protected int m_udpPort; protected int m_udpPort;
@ -279,8 +272,6 @@ namespace OpenMetaverse
{ {
UDPPacketBuffer buf = (UDPPacketBuffer)result.AsyncState; UDPPacketBuffer buf = (UDPPacketBuffer)result.AsyncState;
int bytesSent = m_udpSocket.EndSendTo(result); int bytesSent = m_udpSocket.EndSendTo(result);
PacketSent(buf, bytesSent);
} }
catch (SocketException) { } catch (SocketException) { }
catch (ObjectDisposedException) { } catch (ObjectDisposedException) { }

View File

@ -60,7 +60,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
} }
/// <summary>Holds the actual unacked packet data, sorted by sequence number</summary> /// <summary>Holds the actual unacked packet data, sorted by sequence number</summary>
private SortedDictionary<uint, OutgoingPacket> m_packets = new SortedDictionary<uint, OutgoingPacket>(); private Dictionary<uint, OutgoingPacket> m_packets = new Dictionary<uint, OutgoingPacket>();
/// <summary>Holds packets that need to be added to the unacknowledged list</summary> /// <summary>Holds packets that need to be added to the unacknowledged list</summary>
private LocklessQueue<OutgoingPacket> m_pendingAdds = new LocklessQueue<OutgoingPacket>(); private LocklessQueue<OutgoingPacket> m_pendingAdds = new LocklessQueue<OutgoingPacket>();
/// <summary>Holds information about pending acknowledgements</summary> /// <summary>Holds information about pending acknowledgements</summary>