diff options
author | Justin Clark-Casey (justincc) | 2010-09-17 01:16:21 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2010-09-17 01:16:21 +0100 |
commit | 50724292636c1ee68e2d3d215285b52606c6e7f5 (patch) | |
tree | 0eb92cc6862d16cf9f7419c00b83f6bb6a9431f9 /OpenSim/Region/ClientStack/LindenUDP | |
parent | Merge branch 'master' of ssh://opensimulator.org/var/git/opensim (diff) | |
download | opensim-SC_OLD-50724292636c1ee68e2d3d215285b52606c6e7f5.zip opensim-SC_OLD-50724292636c1ee68e2d3d215285b52606c6e7f5.tar.gz opensim-SC_OLD-50724292636c1ee68e2d3d215285b52606c6e7f5.tar.bz2 opensim-SC_OLD-50724292636c1ee68e2d3d215285b52606c6e7f5.tar.xz |
Send KillPackets on the Task queue rather than the State queue
Object updates are sent on the task queue. It's possible for an object update to be placed on the client queue before a kill packet comes along.
The kill packet would then be placed on the state queue and possibly get sent before the update
If the update gets sent afterwards then client get undeletable no owner objects until relog
Placing the kills in the task queue should mean that they are received after updates. The kill record prevents subsequent updates getting on the queue
Comments state that updates are sent via the state queue but this isn't true. If this was the case this problem might not exist.
Diffstat (limited to 'OpenSim/Region/ClientStack/LindenUDP')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 7 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | 8 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 4 |
3 files changed, 17 insertions, 2 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 2163c12..cede050 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -1523,7 +1523,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1523 | lock (m_entityUpdates.SyncRoot) | 1523 | lock (m_entityUpdates.SyncRoot) |
1524 | { | 1524 | { |
1525 | m_killRecord.Add(localID); | 1525 | m_killRecord.Add(localID); |
1526 | OutPacket(kill, ThrottleOutPacketType.State); | 1526 | |
1527 | // The throttle queue used here must match that being used for updates. Otherwise, there is a | ||
1528 | // chance that a kill packet put on a separate queue will be sent to the client before an existing | ||
1529 | // update packet on another queue. Receiving updates after kills results in unowned and undeletable | ||
1530 | // scene objects in a viewer until that viewer is relogged in. | ||
1531 | OutPacket(kill, ThrottleOutPacketType.Task); | ||
1527 | } | 1532 | } |
1528 | } | 1533 | } |
1529 | } | 1534 | } |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs index 6232c48..ca5a7bd 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | |||
@@ -412,8 +412,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
412 | 412 | ||
413 | /// <summary> | 413 | /// <summary> |
414 | /// Loops through all of the packet queues for this client and tries to send | 414 | /// Loops through all of the packet queues for this client and tries to send |
415 | /// any outgoing packets, obeying the throttling bucket limits | 415 | /// an outgoing packet from each, obeying the throttling bucket limits |
416 | /// </summary> | 416 | /// </summary> |
417 | /// | ||
418 | /// Packet queues are inspected in ascending numerical order starting from 0. Therefore, queues with a lower | ||
419 | /// ThrottleOutPacketType number will see their packet get sent first (e.g. if both Land and Wind queues have | ||
420 | /// packets, then the packet at the front of the Land queue will be sent before the packet at the front of the | ||
421 | /// wind queue). | ||
422 | /// | ||
417 | /// <remarks>This function is only called from a synchronous loop in the | 423 | /// <remarks>This function is only called from a synchronous loop in the |
418 | /// UDPServer so we don't need to bother making this thread safe</remarks> | 424 | /// UDPServer so we don't need to bother making this thread safe</remarks> |
419 | /// <returns>True if any packets were sent, otherwise false</returns> | 425 | /// <returns>True if any packets were sent, otherwise false</returns> |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 56e8c9b..cb298fd 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | |||
@@ -500,6 +500,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
500 | // FIXME: Implement? | 500 | // FIXME: Implement? |
501 | } | 501 | } |
502 | 502 | ||
503 | /// <summary> | ||
504 | /// Actually send a packet to a client. | ||
505 | /// </summary> | ||
506 | /// <param name="outgoingPacket"></param> | ||
503 | internal void SendPacketFinal(OutgoingPacket outgoingPacket) | 507 | internal void SendPacketFinal(OutgoingPacket outgoingPacket) |
504 | { | 508 | { |
505 | UDPPacketBuffer buffer = outgoingPacket.Buffer; | 509 | UDPPacketBuffer buffer = outgoingPacket.Buffer; |