Ensure that packets do NOT get delivered to a client before the modules that can deal with the client's response have finished loading.

avinationmerge
Tom Grimshaw 2010-07-17 15:08:59 -07:00
parent 17412389f3
commit fabe2206db
3 changed files with 41 additions and 1 deletions

View File

@ -334,6 +334,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// protected HashSet<uint> m_attachmentsSent; // protected HashSet<uint> m_attachmentsSent;
private int m_moneyBalance; private int m_moneyBalance;
private bool m_deliverPackets = true;
private int m_animationSequenceNumber = 1; private int m_animationSequenceNumber = 1;
private bool m_SendLogoutPacketWhenClosing = true; private bool m_SendLogoutPacketWhenClosing = true;
private AgentUpdateArgs lastarg; private AgentUpdateArgs lastarg;
@ -378,6 +379,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
get { return m_startpos; } get { return m_startpos; }
set { m_startpos = value; } set { m_startpos = value; }
} }
public bool DeliverPackets
{
get { return m_deliverPackets; }
set {
m_deliverPackets = value;
m_udpClient.m_deliverPackets = value;
}
}
public UUID AgentId { get { return m_agentId; } } public UUID AgentId { get { return m_agentId; } }
public UUID ActiveGroupId { get { return m_activeGroupID; } } public UUID ActiveGroupId { get { return m_activeGroupID; } }
public string ActiveGroupName { get { return m_activeGroupName; } } public string ActiveGroupName { get { return m_activeGroupName; } }

View File

@ -149,6 +149,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
private int m_defaultRTO = 3000; private int m_defaultRTO = 3000;
private int m_maxRTO = 60000; private int m_maxRTO = 60000;
public bool m_deliverPackets = true;
/// <summary> /// <summary>
/// Default constructor /// Default constructor
@ -389,6 +390,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (category >= 0 && category < m_packetOutboxes.Length) if (category >= 0 && category < m_packetOutboxes.Length)
{ {
OpenSim.Framework.LocklessQueue<OutgoingPacket> queue = m_packetOutboxes[category]; OpenSim.Framework.LocklessQueue<OutgoingPacket> queue = m_packetOutboxes[category];
if (m_deliverPackets == false)
{
queue.Enqueue(packet);
return true;
}
TokenBucket bucket = m_throttleCategories[category]; TokenBucket bucket = m_throttleCategories[category];
if (bucket.RemoveTokens(packet.Buffer.DataLength)) if (bucket.RemoveTokens(packet.Buffer.DataLength))
@ -419,6 +427,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// <returns>True if any packets were sent, otherwise false</returns> /// <returns>True if any packets were sent, otherwise false</returns>
public bool DequeueOutgoing() public bool DequeueOutgoing()
{ {
if (m_deliverPackets == false) return false;
OutgoingPacket packet; OutgoingPacket packet;
OpenSim.Framework.LocklessQueue<OutgoingPacket> queue; OpenSim.Framework.LocklessQueue<OutgoingPacket> queue;
TokenBucket bucket; TokenBucket bucket;

View File

@ -900,7 +900,28 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// Start the IClientAPI // Start the IClientAPI
// Spin it off so that it doesn't clog up the LLUDPServer // Spin it off so that it doesn't clog up the LLUDPServer
Util.FireAndForget(delegate(object o) { client.Start(); });
//First, and very importantly:
//
//Set our DeliverPackets flag in the client to *false*
//this will prevent us from missing important messages
//before the modules are bound
client.DeliverPackets = false;
Util.FireAndForget(
delegate
{
try
{
client.Start();
}
finally
{
//Now, release the hounds. er, packets.
client.DeliverPackets = true;
}
}
);
} }
else else
{ {