Added try/catches in the outgoing packet handler to match the one in the incoming packet handler
parent
99abe885c8
commit
d1ab11dc2a
|
@ -776,61 +776,75 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
while (base.IsRunning)
|
while (base.IsRunning)
|
||||||
{
|
{
|
||||||
bool resendUnacked = false;
|
try
|
||||||
bool sendAcks = false;
|
|
||||||
bool sendPings = false;
|
|
||||||
bool packetSent = false;
|
|
||||||
|
|
||||||
elapsedMS += Environment.TickCount - now;
|
|
||||||
|
|
||||||
// Check for pending outgoing resends every 100ms
|
|
||||||
if (elapsedMS >= 100)
|
|
||||||
{
|
{
|
||||||
resendUnacked = true;
|
bool resendUnacked = false;
|
||||||
elapsedMS -= 100;
|
bool sendAcks = false;
|
||||||
++elapsed100MS;
|
bool sendPings = false;
|
||||||
}
|
bool packetSent = false;
|
||||||
// Check for pending outgoing ACKs every 500ms
|
|
||||||
if (elapsed100MS >= 5)
|
|
||||||
{
|
|
||||||
sendAcks = true;
|
|
||||||
elapsed100MS = 0;
|
|
||||||
++elapsed500MS;
|
|
||||||
}
|
|
||||||
// Send pings to clients every 5000ms
|
|
||||||
if (elapsed500MS >= 10)
|
|
||||||
{
|
|
||||||
sendPings = true;
|
|
||||||
elapsed500MS = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_scene.ClientManager.ForEachSync(
|
elapsedMS += Environment.TickCount - now;
|
||||||
delegate(IClientAPI client)
|
|
||||||
|
// Check for pending outgoing resends every 100ms
|
||||||
|
if (elapsedMS >= 100)
|
||||||
{
|
{
|
||||||
if (client is LLClientView)
|
resendUnacked = true;
|
||||||
{
|
elapsedMS -= 100;
|
||||||
LLUDPClient udpClient = ((LLClientView)client).UDPClient;
|
++elapsed100MS;
|
||||||
|
}
|
||||||
|
// Check for pending outgoing ACKs every 500ms
|
||||||
|
if (elapsed100MS >= 5)
|
||||||
|
{
|
||||||
|
sendAcks = true;
|
||||||
|
elapsed100MS = 0;
|
||||||
|
++elapsed500MS;
|
||||||
|
}
|
||||||
|
// Send pings to clients every 5000ms
|
||||||
|
if (elapsed500MS >= 10)
|
||||||
|
{
|
||||||
|
sendPings = true;
|
||||||
|
elapsed500MS = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (udpClient.IsConnected)
|
m_scene.ClientManager.ForEachSync(
|
||||||
|
delegate(IClientAPI client)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
if (udpClient.DequeueOutgoing())
|
if (client is LLClientView)
|
||||||
packetSent = true;
|
|
||||||
if (resendUnacked)
|
|
||||||
ResendUnacked(udpClient);
|
|
||||||
if (sendAcks)
|
|
||||||
{
|
{
|
||||||
SendAcks(udpClient);
|
LLUDPClient udpClient = ((LLClientView)client).UDPClient;
|
||||||
udpClient.SendPacketStats();
|
|
||||||
|
if (udpClient.IsConnected)
|
||||||
|
{
|
||||||
|
if (udpClient.DequeueOutgoing())
|
||||||
|
packetSent = true;
|
||||||
|
if (resendUnacked)
|
||||||
|
ResendUnacked(udpClient);
|
||||||
|
if (sendAcks)
|
||||||
|
{
|
||||||
|
SendAcks(udpClient);
|
||||||
|
udpClient.SendPacketStats();
|
||||||
|
}
|
||||||
|
if (sendPings)
|
||||||
|
SendPing(udpClient);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (sendPings)
|
}
|
||||||
SendPing(udpClient);
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler iteration for " + client.Name + " threw an exception: " + ex.Message, ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
);
|
|
||||||
|
|
||||||
if (!packetSent)
|
if (!packetSent)
|
||||||
Thread.Sleep(20);
|
Thread.Sleep(20);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler loop threw an exception: " + ex.Message, ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue