From c5604d38573e6723e668073be6553ebfa7354a09 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 6 Jan 2019 01:23:08 +0000 Subject: similar to sps array in scenegraph --- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 29 ++++++++++++++------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 66a5325..51392ae 100755 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -43,9 +43,7 @@ namespace OpenSim.Region.Framework.Scenes public delegate void PhysicsCrash(); public delegate void AttachToBackupDelegate(SceneObjectGroup sog); - public delegate void DetachFromBackupDelegate(SceneObjectGroup sog); - public delegate void ChangedBackupDelegate(SceneObjectGroup sog); /// @@ -74,6 +72,8 @@ namespace OpenSim.Region.Framework.Scenes protected ConcurrentDictionary m_scenePresenceMap = new ConcurrentDictionary(); protected ConcurrentDictionary m_scenePresenceLocalIDMap = new ConcurrentDictionary(); protected List m_scenePresenceArray = new List(); + private int m_spArrayLastVersion; + private int m_spArrayVersion; protected internal EntityManager Entities = new EntityManager(); @@ -121,6 +121,8 @@ namespace OpenSim.Region.Framework.Scenes { m_scenePresencesLock = new System.Threading.ReaderWriterLockSlim(); m_parentScene = parent; + m_spArrayLastVersion = 0; + m_spArrayVersion = 0; } public PhysicsScene PhysicsScene @@ -154,6 +156,8 @@ namespace OpenSim.Region.Framework.Scenes m_scenePresenceMap = new ConcurrentDictionary(); m_scenePresenceLocalIDMap = new ConcurrentDictionary(); m_scenePresenceArray = new List(); + m_spArrayLastVersion = 0; + m_spArrayVersion = 0; if (_PhyScene != null) _PhyScene.OnPhysicsCrash -= physicsBasedCrash; _PhyScene = null; @@ -709,13 +713,10 @@ namespace OpenSim.Region.Framework.Scenes m_numChildAgents++; - List newlist = new List(m_scenePresenceArray); - if (!m_scenePresenceMap.ContainsKey(presence.UUID)) { m_scenePresenceMap[presence.UUID] = presence; m_scenePresenceLocalIDMap[presence.LocalId] = presence; - newlist.Add(presence); } else { @@ -724,8 +725,6 @@ namespace OpenSim.Region.Framework.Scenes uint oldLocalID = oldref.LocalId; // Replace the presence reference in the dictionary with the new value m_scenePresenceMap[presence.UUID] = presence; - newlist[newlist.IndexOf(oldref)] = presence; - if(presence.LocalId != oldLocalID) { m_scenePresenceLocalIDMap.TryRemove(oldLocalID, out oldref); @@ -734,8 +733,7 @@ namespace OpenSim.Region.Framework.Scenes // Find the index in the list where the old ref was stored and update the reference } - // Swap out the dictionary and list with new references - m_scenePresenceArray = newlist; + ++m_spArrayVersion; } finally { @@ -768,10 +766,8 @@ namespace OpenSim.Region.Framework.Scenes if(m_scenePresenceMap.TryRemove(agentID, out oldref)) { // Find the index in the list where the old ref was stored and remove the reference - List newsps = new List(m_scenePresenceArray); - newsps.RemoveAt(newsps.IndexOf(oldref)); - m_scenePresenceArray = newsps; m_scenePresenceLocalIDMap.TryRemove(oldref.LocalId, out oldref); + ++m_spArrayVersion; } else { @@ -911,8 +907,13 @@ namespace OpenSim.Region.Framework.Scenes bool entered = false; try { - m_scenePresencesLock.EnterReadLock(); + m_scenePresencesLock.EnterWriteLock(); entered = true; + if(m_spArrayLastVersion != m_spArrayVersion) + { + m_scenePresenceArray = new List(m_scenePresenceMap.Values); + m_spArrayLastVersion = m_spArrayVersion; + } return m_scenePresenceArray; } catch @@ -922,7 +923,7 @@ namespace OpenSim.Region.Framework.Scenes finally { if(entered) - m_scenePresencesLock.ExitReadLock(); + m_scenePresencesLock.ExitWriteLock(); } } -- cgit v1.1