diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 3a293a55a2..9cd469214c 100755 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -876,7 +876,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments m_scene.DeleteSceneObject(so, false, false); so.RemoveScriptInstances(true); - so.Clear(); + so.Dispose(); return; } @@ -1213,7 +1213,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments // Now, remove the scripts so.RemoveScriptInstances(true); - so.Clear(); + so.Dispose(); } protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal( diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index bca36eec7d..910d591ec4 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2795,7 +2795,7 @@ namespace OpenSim.Region.Framework.Scenes // use this to mean also full delete if (removeScripts) - group.Clear(); + group.Dispose(); partList = null; // m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID); } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index af2b286c83..df08074ed9 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -106,7 +106,7 @@ namespace OpenSim.Region.Framework.Scenes /// A scene object group is conceptually an object in the scene. The object is constituted of SceneObjectParts /// (often known as prims), one of which is considered the root part. /// - public partial class SceneObjectGroup : EntityBase, ISceneObject + public partial class SceneObjectGroup : EntityBase, ISceneObject, IDisposable { // Axis selection bitmask used by SetAxisRotation() // Just happen to be the same bits used by llSetStatus() and defined in ScriptBaseClass. @@ -907,7 +907,7 @@ namespace OpenSim.Region.Framework.Scenes avsToCrossFar.Clear(); avsToCross.Clear(); sog.RemoveScriptInstances(true); - sog.Clear(); + sog.Dispose(); return sog; } else @@ -1362,6 +1362,42 @@ namespace OpenSim.Region.Framework.Scenes { } + ~SceneObjectGroup() + { + Dispose(false); + } + + private bool disposed = false; + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!disposed) + { + IsDeleted = true; + + SceneObjectPart[] parts = m_parts.GetArray(); + for(int i= 0; i < parts.Length; ++i) + parts[i].Dispose(); + + m_parts.Clear(); + m_sittingAvatars.Clear(); + // m_rootPart = null; + + m_targets.Clear(); + m_partsNameToLinkMap.Clear(); + + disposed = true; + } + } + + + public void LoadScriptState(XmlDocument doc) { XmlNodeList nodes = doc.GetElementsByTagName("SavedScriptState"); @@ -2412,7 +2448,7 @@ namespace OpenSim.Region.Framework.Scenes } }); - backup_group.Clear(); + backup_group.Dispose(); backup_group = null; } } @@ -5277,17 +5313,6 @@ namespace OpenSim.Region.Framework.Scenes InvalidateEffectivePerms(); } - // clear some references to easy cg - public void Clear() - { - m_parts.Clear(); - m_sittingAvatars.Clear(); -// m_rootPart = null; - - m_targets.Clear(); - m_partsNameToLinkMap.Clear(); - } - private Dictionary m_partsNameToLinkMap = new Dictionary(); private string GetLinkNumber_lastname; private int GetLinkNumber_lastnumber; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index d43ebbe315..b81fa39250 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -93,7 +93,7 @@ namespace OpenSim.Region.Framework.Scenes #endregion Enumerations - public class SceneObjectPart : ISceneEntity + public class SceneObjectPart : ISceneEntity, IDisposable { /// /// Denote all sides of the prim @@ -454,6 +454,40 @@ namespace OpenSim.Region.Framework.Scenes AggregateInnerPerms(); } + ~SceneObjectPart() + { + Dispose(false); + } + + private bool disposed = false; + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!disposed) + { + if (KeyframeMotion != null) + { + KeyframeMotion.Delete(); + KeyframeMotion = null; + } + if (PhysActor != null) + RemoveFromPhysics(); + + if (m_inventory != null) + { + m_inventory.Dispose(); + m_inventory = null; + } + disposed = true; + } + } + #endregion Constructors #region XML Schema diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 50076f0fbd..e258bb9d8c 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -43,7 +43,7 @@ using PermissionMask = OpenSim.Framework.PermissionMask; namespace OpenSim.Region.Framework.Scenes { - public class SceneObjectPartInventory : IEntityInventory + public class SceneObjectPartInventory : IEntityInventory , IDisposable { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -125,6 +125,32 @@ namespace OpenSim.Region.Framework.Scenes m_part = part; } + ~SceneObjectPartInventory() + { + Dispose(false); + } + + private bool disposed = false; + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!disposed) + { + if (m_items != null) + { + m_items.Dispose(); + m_items = null; + } + disposed = true; + } + } + /// /// Force the task inventory of this prim to persist at the next update sweep ///