From 1fd62bc1afa1043737a738210255e37d66313134 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Tue, 11 Dec 2007 20:32:22 +0000 Subject: force a flush before client shutdown, so no important packets are lost --- OpenSim/Region/ClientStack/ClientView.cs | 14 +++++++---- OpenSim/Region/ClientStack/PacketQueue.cs | 41 +++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 7 deletions(-) (limited to 'OpenSim/Region/ClientStack') diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs index 1a30619..e199f30 100644 --- a/OpenSim/Region/ClientStack/ClientView.cs +++ b/OpenSim/Region/ClientStack/ClientView.cs @@ -60,7 +60,6 @@ namespace OpenSim.Region.ClientStack //private AgentAssetUpload UploadAssets; private LLUUID newAssetFolder = LLUUID.Zero; private int debug = 0; - private ClientManager m_clientManager; private AssetCache m_assetCache; // private InventoryCache m_inventoryCache; private int cachedtextureserial = 0; @@ -162,6 +161,7 @@ namespace OpenSim.Region.ClientStack /* METHODS */ + /* TODO: pull out clientManager param */ public ClientView(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, ClientManager clientManager, IScene scene, AssetCache assetCache, PacketServer packServer, AgentCircuitManager authenSessions) @@ -169,7 +169,6 @@ namespace OpenSim.Region.ClientStack m_moneyBalance = 1000; m_scene = scene; - m_clientManager = clientManager; m_assetCache = assetCache; m_networkServer = packServer; @@ -209,13 +208,18 @@ namespace OpenSim.Region.ClientStack # region Client Methods + public void Close() { - clientPingTimer.Stop(); + // FLUSH Packets + PacketQueue.Flush(); + PacketQueue.Close(); + // Pull Client out of Region m_scene.RemoveClient(AgentId); - - PacketQueue.Close(); + + // Shut down timers + clientPingTimer.Stop(); ClientThread.Abort(); } diff --git a/OpenSim/Region/ClientStack/PacketQueue.cs b/OpenSim/Region/ClientStack/PacketQueue.cs index 193b4d7..747ef18 100644 --- a/OpenSim/Region/ClientStack/PacketQueue.cs +++ b/OpenSim/Region/ClientStack/PacketQueue.cs @@ -168,10 +168,47 @@ namespace OpenSim.Region.ClientStack return SendQueue.Dequeue(); } + public void Flush() + { + lock(this) { + while (PacketsWaiting()) + { + //Now comes the fun part.. we dump all our elements into PacketQueue that we've saved up. + if (ResendOutgoingPacketQueue.Count > 0) + { + SendQueue.Enqueue(ResendOutgoingPacketQueue.Dequeue()); + } + if (LandOutgoingPacketQueue.Count > 0) + { + SendQueue.Enqueue(LandOutgoingPacketQueue.Dequeue()); + } + if (WindOutgoingPacketQueue.Count > 0) + { + SendQueue.Enqueue(WindOutgoingPacketQueue.Dequeue()); + } + if (CloudOutgoingPacketQueue.Count > 0) + { + SendQueue.Enqueue(CloudOutgoingPacketQueue.Dequeue()); + } + if (TaskOutgoingPacketQueue.Count > 0) + { + SendQueue.Enqueue(TaskOutgoingPacketQueue.Dequeue()); + } + if (TextureOutgoingPacketQueue.Count > 0) + { + SendQueue.Enqueue(TextureOutgoingPacketQueue.Dequeue()); + } + if (AssetOutgoingPacketQueue.Count > 0) + { + SendQueue.Enqueue(AssetOutgoingPacketQueue.Dequeue()); + } + } + // MainLog.Instance.Verbose("THROTTLE", "Processed " + throttleLoops + " packets"); + } + } + public void Close() { - // one last push - ProcessThrottle(); throttleTimer.Stop(); } -- cgit v1.1