aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/LindenUDP
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ClientStack/LindenUDP')
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs20
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs15
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs22
3 files changed, 50 insertions, 7 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index f99fa16..9189260 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -3598,14 +3598,30 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3598 EntityUpdate update; 3598 EntityUpdate update;
3599 while (updatesThisCall < maxUpdates && m_entityUpdates.TryDequeue(out update)) 3599 while (updatesThisCall < maxUpdates && m_entityUpdates.TryDequeue(out update))
3600 { 3600 {
3601 // If we have sent a kill packet for this object
3602 // drop any updates on the floor
3603 if (update.Entity is SceneObjectPart) 3601 if (update.Entity is SceneObjectPart)
3604 { 3602 {
3605 SceneObjectPart part = (SceneObjectPart)update.Entity; 3603 SceneObjectPart part = (SceneObjectPart)update.Entity;
3606 if (m_killRecord.Contains(part.ParentGroup.RootPart.LocalId)) 3604 if (m_killRecord.Contains(part.ParentGroup.RootPart.LocalId))
3607 continue; 3605 continue;
3608 3606
3607 // Please do not remove this unless you can demonstrate on the OpenSim mailing list that a client
3608 // will never receive an update after a prim kill. Even then, keeping the kill record may be a good
3609 // safety measure.
3610 //
3611 // If a Linden Lab 1.23.5 client (and possibly later and earlier) receives an object update
3612 // after a kill, it will keep displaying the deleted object until relog. OpenSim currently performs
3613 // updates and kills on different threads with different scheduling strategies, hence this protection.
3614 //
3615 // This doesn't appear to apply to child prims - a client will happily ignore these updates
3616 // after the root prim has been deleted.
3617 if (m_killRecord.Contains(part.LocalId))
3618 {
3619 // m_log.WarnFormat(
3620 // "[CLIENT]: Preventing update for prim with local id {0} after client for user {1} told it was deleted",
3621 // part.LocalId, Name);
3622 continue;
3623 }
3624
3609 if (part.ParentGroup.IsAttachment && m_disableFacelights) 3625 if (part.ParentGroup.IsAttachment && m_disableFacelights)
3610 { 3626 {
3611 if (part.ParentGroup.RootPart.Shape.State != (byte)AttachmentPoint.LeftHand && 3627 if (part.ParentGroup.RootPart.Shape.State != (byte)AttachmentPoint.LeftHand &&
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
index ed0e60d..5aa9b40 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
@@ -400,7 +400,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
400 return data; 400 return data;
401 } 401 }
402 402
403 public bool EnqueueOutgoing(OutgoingPacket packet) 403 /// <summary>
404 /// Queue an outgoing packet if appropriate.
405 /// </summary>
406 /// <param name="packet"></param>
407 /// <param name="forceQueue">Always queue the packet if at all possible.</param>
408 /// <returns>
409 /// true if the packet has been queued,
410 /// false if the packet has not been queued and should be sent immediately.
411 /// </returns>
412 public bool EnqueueOutgoing(OutgoingPacket packet, bool forceQueue)
404 { 413 {
405 int category = (int)packet.Category; 414 int category = (int)packet.Category;
406 415
@@ -416,14 +425,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
416 425
417 TokenBucket bucket = m_throttleCategories[category]; 426 TokenBucket bucket = m_throttleCategories[category];
418 427
419 if (bucket.RemoveTokens(packet.Buffer.DataLength)) 428 if (!forceQueue && bucket.RemoveTokens(packet.Buffer.DataLength))
420 { 429 {
421 // Enough tokens were removed from the bucket, the packet will not be queued 430 // Enough tokens were removed from the bucket, the packet will not be queued
422 return false; 431 return false;
423 } 432 }
424 else 433 else
425 { 434 {
426 // Not enough tokens in the bucket, queue this packet 435 // Force queue specified or not enough tokens in the bucket, queue this packet
427 queue.Enqueue(packet); 436 queue.Enqueue(packet);
428 return true; 437 return true;
429 } 438 }
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index ef0a178..6985449 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -312,6 +312,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
312 } 312 }
313 } 313 }
314 314
315 /// <summary>
316 /// Start the process of sending a packet to the client.
317 /// </summary>
318 /// <param name="udpClient"></param>
319 /// <param name="packet"></param>
320 /// <param name="category"></param>
321 /// <param name="allowSplitting"></param>
315 public void SendPacket(LLUDPClient udpClient, Packet packet, ThrottleOutPacketType category, bool allowSplitting) 322 public void SendPacket(LLUDPClient udpClient, Packet packet, ThrottleOutPacketType category, bool allowSplitting)
316 { 323 {
317 // CoarseLocationUpdate packets cannot be split in an automated way 324 // CoarseLocationUpdate packets cannot be split in an automated way
@@ -339,6 +346,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
339 } 346 }
340 } 347 }
341 348
349 /// <summary>
350 /// Start the process of sending a packet to the client.
351 /// </summary>
352 /// <param name="udpClient"></param>
353 /// <param name="data"></param>
354 /// <param name="type"></param>
355 /// <param name="category"></param>
342 public void SendPacketData(LLUDPClient udpClient, byte[] data, PacketType type, ThrottleOutPacketType category) 356 public void SendPacketData(LLUDPClient udpClient, byte[] data, PacketType type, ThrottleOutPacketType category)
343 { 357 {
344 int dataLength = data.Length; 358 int dataLength = data.Length;
@@ -396,7 +410,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
396 410
397 OutgoingPacket outgoingPacket = new OutgoingPacket(udpClient, buffer, category); 411 OutgoingPacket outgoingPacket = new OutgoingPacket(udpClient, buffer, category);
398 412
399 if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket)) 413 // If a Linden Lab 1.23.5 client receives an update packet after a kill packet for an object, it will
414 // continue to display the deleted object until relog. Therefore, we need to always queue a kill object
415 // packet so that it isn't sent before a queued update packet.
416 bool requestQueue = type == PacketType.KillObject;
417 if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket, requestQueue))
400 SendPacketFinal(outgoingPacket); 418 SendPacketFinal(outgoingPacket);
401 419
402 #endregion Queue or Send 420 #endregion Queue or Send
@@ -489,7 +507,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
489 //Interlocked.Increment(ref Stats.ResentPackets); 507 //Interlocked.Increment(ref Stats.ResentPackets);
490 508
491 // Requeue or resend the packet 509 // Requeue or resend the packet
492 if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket)) 510 if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket, false))
493 SendPacketFinal(outgoingPacket); 511 SendPacketFinal(outgoingPacket);
494 } 512 }
495 } 513 }