Ensure that packets do NOT get delivered to a client before the modules that can deal with the client's response have finished loading.
parent
17412389f3
commit
fabe2206db
|
@ -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; } }
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue