* Changed a recursive BeginRobustReceive loop to a flat while loop to avoid lethal stack overflows.

0.6.5-rc1
lbsa71 2009-03-25 19:30:36 +00:00
parent e694e1a657
commit 3cb06cc4cc
1 changed files with 33 additions and 38 deletions

View File

@ -290,10 +290,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// automatically dealt with until the next set of valid UDP data is received. /// automatically dealt with until the next set of valid UDP data is received.
/// </summary> /// </summary>
private void BeginRobustReceive() private void BeginRobustReceive()
{
bool done = false;
while (!done)
{ {
try try
{ {
BeginReceive(); BeginReceive();
done = true;
} }
catch (SocketException e) catch (SocketException e)
{ {
@ -301,22 +306,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// Reset connection and get next UDP packet off the buffer // Reset connection and get next UDP packet off the buffer
// If the UDP packet is part of the same stream, this will happen several hundreds of times before // If the UDP packet is part of the same stream, this will happen several hundreds of times before
// the next set of UDP data is for a valid client. // the next set of UDP data is for a valid client.
ResetServerEndPoint(e);
}
catch (ObjectDisposedException)
{
m_log.Info("[UDPSERVER]: UDP Object disposed. No need to worry about this if you're restarting the simulator.");
}
}
/// <summary>
/// Reset the server endpoint
/// </summary>
/// <param name="e">
/// The exception that has triggered the reset. Can be null if there was no exception.
/// </param>
private void ResetServerEndPoint(Exception e)
{
try try
{ {
CloseCircuit(e); CloseCircuit(e);
@ -324,13 +314,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
catch (Exception e2) catch (Exception e2)
{ {
m_log.ErrorFormat( m_log.ErrorFormat(
"[CLIENT]: Exception thrown when trying to close the circuit for {0} - {1}", reusedEpSender, e2); "[CLIENT]: Exception thrown when trying to close the circuit for {0} - {1}", reusedEpSender,
e2);
} }
}
catch (ObjectDisposedException)
{
m_log.Info(
"[UDPSERVER]: UDP Object disposed. No need to worry about this if you're restarting the simulator.");
// ENDLESS LOOP ON PURPOSE! done = true;
// We need to purge the UDP stream of crap from the client that disconnected nastily or the UDP server will die }
// The only way to do that is to BeginRobustReceive again! }
BeginRobustReceive();
} }
/// <summary> /// <summary>