From f05f583613850ef480d7be6a74220da0507e8b9b Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Fri, 8 Feb 2008 22:39:08 +0000 Subject: [PATCH] Still chasing logout memory leak. Putting in small changes and temporary light verbosity to this end --- OpenSim/Framework/ClientManager.cs | 3 +++ .../Communications/Cache/AssetTransactions.cs | 17 ++++++++++++----- OpenSim/Region/ClientStack/ClientView.cs | 12 ++++++++++-- OpenSim/Region/ClientStack/PacketServer.cs | 12 +++++++++--- OpenSim/Region/Environment/Scenes/Scene.cs | 5 ++++- .../Region/Environment/Scenes/ScenePresence.cs | 2 +- 6 files changed, 39 insertions(+), 12 deletions(-) diff --git a/OpenSim/Framework/ClientManager.cs b/OpenSim/Framework/ClientManager.cs index 6843dcebae..064b82d667 100644 --- a/OpenSim/Framework/ClientManager.cs +++ b/OpenSim/Framework/ClientManager.cs @@ -26,6 +26,7 @@ * */ +using System; using System.Collections.Generic; using libsecondlife; using libsecondlife.Packets; @@ -70,7 +71,9 @@ namespace OpenSim.Framework public void Remove(uint id) { + //m_log.Info(String.Format("[CLIENT]: Removing client with code {0}, current count {1}", id, m_clients.Count)); m_clients.Remove(id); + m_log.Info(String.Format("[CLIENT]: Removed client with code {0}, new client count {1}", id, m_clients.Count)); } public void Add(uint id, IClientAPI client) diff --git a/OpenSim/Framework/Communications/Cache/AssetTransactions.cs b/OpenSim/Framework/Communications/Cache/AssetTransactions.cs index d09e34373d..4a75f52981 100644 --- a/OpenSim/Framework/Communications/Cache/AssetTransactions.cs +++ b/OpenSim/Framework/Communications/Cache/AssetTransactions.cs @@ -103,12 +103,22 @@ namespace OpenSim.Framework.Communications.Cache } } + /// + /// Get an uploaded asset. If the data is successfully retrieved, the transaction will be removed. + /// + /// + /// The asset if the upload has completed, null if it has not. public AssetBase GetTransactionAsset(LLUUID transactionID) { if (XferUploaders.ContainsKey(transactionID)) { - return XferUploaders[transactionID].GetAssetData(); + AssetXferUploader uploader = XferUploaders[transactionID]; + AssetBase asset = uploader.GetAssetData(); + XferUploaders.Remove(transactionID); + + return asset; } + return null; } @@ -237,6 +247,7 @@ namespace OpenSim.Framework.Communications.Cache SaveAssetToFile(filename, Asset.Data); } } + ///Left this in and commented in case there are unforseen issues //private void SaveAssetToFile(string filename, byte[] data) //{ @@ -311,10 +322,6 @@ namespace OpenSim.Framework.Communications.Cache } } - public void UpdateInventoryItem(LLUUID itemID) - { - } - public AssetBase GetAssetData() { if (m_finished) diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs index 363688ff4e..6f25191c58 100644 --- a/OpenSim/Region/ClientStack/ClientView.cs +++ b/OpenSim/Region/ClientStack/ClientView.cs @@ -53,7 +53,7 @@ namespace OpenSim.Region.ClientStack { ~ClientView() { - m_log.Info("[CLIENTVIEW]: Dstructor called"); + System.Console.WriteLine("[CLIENTVIEW]: Destructor called"); } private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); @@ -237,6 +237,10 @@ namespace OpenSim.Region.ClientStack private void CloseCleanup() { m_scene.RemoveClient(AgentId); + + //m_log.Info(String.Format("[CLIENTVIEW] Memory pre GC {0}", System.GC.GetTotalMemory(false))); + //m_log.Info(String.Format("[CLIENTVIEW] Memory post GC {0}", System.GC.GetTotalMemory(true))); + // Send the STOP packet DisableSimulatorPacket disable = (DisableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.DisableSimulator); OutPacket(disable, ThrottleOutPacketType.Task); @@ -264,6 +268,11 @@ namespace OpenSim.Region.ClientStack m_clientThread.Abort(); } + /// + /// Close down the client view. This *must* be the last method called, since the last # + /// statement of CloseCleanup() aborts the thread. + /// + /// public void Close(bool ShutdownCircult) { // Pull Client out of Region @@ -273,7 +282,6 @@ namespace OpenSim.Region.ClientStack if (ShutdownCircult) OnConnectionClosed(this); - CloseCleanup(); } diff --git a/OpenSim/Region/ClientStack/PacketServer.cs b/OpenSim/Region/ClientStack/PacketServer.cs index 9608ce5979..7036de9324 100644 --- a/OpenSim/Region/ClientStack/PacketServer.cs +++ b/OpenSim/Region/ClientStack/PacketServer.cs @@ -25,6 +25,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + +using System; using System.Net; using System.Net.Sockets; using libsecondlife; @@ -133,13 +135,17 @@ namespace OpenSim.Region.ClientStack //m_scene.ClientManager.CloseAllAgents(circuitcode); } + /// + /// Completely close down the given client. + /// + /// public virtual void CloseClient(IClientAPI client) { - //m_log.Info("PacketServer:CloseClient()"); - + m_log.Info("PacketServer:CloseClient()"); + CloseCircuit(client.CircuitCode); + m_scene.ClientManager.Remove(client.CircuitCode); client.Close(false); - m_scene.ClientManager.Remove(client.CircuitCode); } } } diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 348053070c..3fafaf4343 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1445,7 +1445,10 @@ namespace OpenSim.Region.Environment.Scenes } // Remove client agent from profile, so new logins will work - CommsManager.UserService.clearUserAgent(agentID); + CommsManager.UserService.clearUserAgent(agentID); + + //m_log.Info(String.Format("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false))); + //m_log.Info(String.Format("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true))); } public override void CloseAllAgents(uint circuitcode) diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index 6fae71b77a..1b9e154499 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -41,7 +41,7 @@ namespace OpenSim.Region.Environment.Scenes { ~ScenePresence() { - m_log.Info("[ScenePresence] Destructor called"); + System.Console.WriteLine("[ScenePresence] Destructor called"); } private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);