diff --git a/OpenSim/Framework/MapAndArray.cs b/OpenSim/Framework/MapAndArray.cs index e6b2800e64..e633ea330c 100644 --- a/OpenSim/Framework/MapAndArray.cs +++ b/OpenSim/Framework/MapAndArray.cs @@ -27,6 +27,7 @@ using System; using System.Collections.Generic; +using System.Runtime.InteropServices; namespace OpenSim.Framework { @@ -82,12 +83,10 @@ namespace OpenSim.Framework { lock (m_syncRoot) { - bool containedKey = m_dict.ContainsKey(key); - - m_dict[key] = value; + ref TValue curvalue = ref CollectionsMarshal.GetValueRefOrAddDefault(m_dict, key, out bool existed); + curvalue = value; m_array = null; - - return !containedKey; + return existed; } } @@ -117,9 +116,8 @@ namespace OpenSim.Framework { lock (m_syncRoot) { - bool removed = m_dict.Remove(key); m_array = null; - return removed; + return m_dict.Remove(key); } } @@ -156,7 +154,8 @@ namespace OpenSim.Framework { lock (m_syncRoot) { - m_dict = new Dictionary(); + if(m_dict.Count > 0) + m_dict = new Dictionary(); m_array = null; } } @@ -174,7 +173,7 @@ namespace OpenSim.Framework if (m_array == null) { if(m_dict.Count == 0) - return new TValue[0]; + return Array.Empty(); m_array = new TValue[m_dict.Count]; m_dict.Values.CopyTo(m_array, 0); } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 5c6b6ee479..3cb25d3362 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -1428,15 +1428,6 @@ namespace OpenSim.Region.Framework.Scenes 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_rotTargets.Clear(); - m_targetsByScript.Clear(); - m_partsNameToLinkMap.Clear(); } } @@ -2850,7 +2841,7 @@ namespace OpenSim.Region.Framework.Scenes { lock (m_parts.SyncRoot) { - List partsList = new(m_parts.GetArray()); + SceneObjectPart[] partsList = m_parts.GetArray(); m_parts.Clear(); foreach (SceneObjectPart part in partsList) {