similar to sps array in scenegraph

0.9.1.0-post-fixes
UbitUmarov 2019-01-06 01:23:08 +00:00
parent f2b447a08f
commit c5604d3857
1 changed files with 15 additions and 14 deletions

View File

@ -43,9 +43,7 @@ namespace OpenSim.Region.Framework.Scenes
public delegate void PhysicsCrash(); public delegate void PhysicsCrash();
public delegate void AttachToBackupDelegate(SceneObjectGroup sog); public delegate void AttachToBackupDelegate(SceneObjectGroup sog);
public delegate void DetachFromBackupDelegate(SceneObjectGroup sog); public delegate void DetachFromBackupDelegate(SceneObjectGroup sog);
public delegate void ChangedBackupDelegate(SceneObjectGroup sog); public delegate void ChangedBackupDelegate(SceneObjectGroup sog);
/// <summary> /// <summary>
@ -74,6 +72,8 @@ namespace OpenSim.Region.Framework.Scenes
protected ConcurrentDictionary<UUID, ScenePresence> m_scenePresenceMap = new ConcurrentDictionary<UUID, ScenePresence>(); protected ConcurrentDictionary<UUID, ScenePresence> m_scenePresenceMap = new ConcurrentDictionary<UUID, ScenePresence>();
protected ConcurrentDictionary<uint, ScenePresence> m_scenePresenceLocalIDMap = new ConcurrentDictionary<uint, ScenePresence>(); protected ConcurrentDictionary<uint, ScenePresence> m_scenePresenceLocalIDMap = new ConcurrentDictionary<uint, ScenePresence>();
protected List<ScenePresence> m_scenePresenceArray = new List<ScenePresence>(); protected List<ScenePresence> m_scenePresenceArray = new List<ScenePresence>();
private int m_spArrayLastVersion;
private int m_spArrayVersion;
protected internal EntityManager Entities = new EntityManager(); protected internal EntityManager Entities = new EntityManager();
@ -121,6 +121,8 @@ namespace OpenSim.Region.Framework.Scenes
{ {
m_scenePresencesLock = new System.Threading.ReaderWriterLockSlim(); m_scenePresencesLock = new System.Threading.ReaderWriterLockSlim();
m_parentScene = parent; m_parentScene = parent;
m_spArrayLastVersion = 0;
m_spArrayVersion = 0;
} }
public PhysicsScene PhysicsScene public PhysicsScene PhysicsScene
@ -154,6 +156,8 @@ namespace OpenSim.Region.Framework.Scenes
m_scenePresenceMap = new ConcurrentDictionary<UUID, ScenePresence>(); m_scenePresenceMap = new ConcurrentDictionary<UUID, ScenePresence>();
m_scenePresenceLocalIDMap = new ConcurrentDictionary<uint, ScenePresence>(); m_scenePresenceLocalIDMap = new ConcurrentDictionary<uint, ScenePresence>();
m_scenePresenceArray = new List<ScenePresence>(); m_scenePresenceArray = new List<ScenePresence>();
m_spArrayLastVersion = 0;
m_spArrayVersion = 0;
if (_PhyScene != null) if (_PhyScene != null)
_PhyScene.OnPhysicsCrash -= physicsBasedCrash; _PhyScene.OnPhysicsCrash -= physicsBasedCrash;
_PhyScene = null; _PhyScene = null;
@ -709,13 +713,10 @@ namespace OpenSim.Region.Framework.Scenes
m_numChildAgents++; m_numChildAgents++;
List<ScenePresence> newlist = new List<ScenePresence>(m_scenePresenceArray);
if (!m_scenePresenceMap.ContainsKey(presence.UUID)) if (!m_scenePresenceMap.ContainsKey(presence.UUID))
{ {
m_scenePresenceMap[presence.UUID] = presence; m_scenePresenceMap[presence.UUID] = presence;
m_scenePresenceLocalIDMap[presence.LocalId] = presence; m_scenePresenceLocalIDMap[presence.LocalId] = presence;
newlist.Add(presence);
} }
else else
{ {
@ -724,8 +725,6 @@ namespace OpenSim.Region.Framework.Scenes
uint oldLocalID = oldref.LocalId; uint oldLocalID = oldref.LocalId;
// Replace the presence reference in the dictionary with the new value // Replace the presence reference in the dictionary with the new value
m_scenePresenceMap[presence.UUID] = presence; m_scenePresenceMap[presence.UUID] = presence;
newlist[newlist.IndexOf(oldref)] = presence;
if(presence.LocalId != oldLocalID) if(presence.LocalId != oldLocalID)
{ {
m_scenePresenceLocalIDMap.TryRemove(oldLocalID, out oldref); 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 // 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_spArrayVersion;
m_scenePresenceArray = newlist;
} }
finally finally
{ {
@ -768,10 +766,8 @@ namespace OpenSim.Region.Framework.Scenes
if(m_scenePresenceMap.TryRemove(agentID, out oldref)) if(m_scenePresenceMap.TryRemove(agentID, out oldref))
{ {
// Find the index in the list where the old ref was stored and remove the reference // Find the index in the list where the old ref was stored and remove the reference
List<ScenePresence> newsps = new List<ScenePresence>(m_scenePresenceArray);
newsps.RemoveAt(newsps.IndexOf(oldref));
m_scenePresenceArray = newsps;
m_scenePresenceLocalIDMap.TryRemove(oldref.LocalId, out oldref); m_scenePresenceLocalIDMap.TryRemove(oldref.LocalId, out oldref);
++m_spArrayVersion;
} }
else else
{ {
@ -911,8 +907,13 @@ namespace OpenSim.Region.Framework.Scenes
bool entered = false; bool entered = false;
try try
{ {
m_scenePresencesLock.EnterReadLock(); m_scenePresencesLock.EnterWriteLock();
entered = true; entered = true;
if(m_spArrayLastVersion != m_spArrayVersion)
{
m_scenePresenceArray = new List<ScenePresence>(m_scenePresenceMap.Values);
m_spArrayLastVersion = m_spArrayVersion;
}
return m_scenePresenceArray; return m_scenePresenceArray;
} }
catch catch
@ -922,7 +923,7 @@ namespace OpenSim.Region.Framework.Scenes
finally finally
{ {
if(entered) if(entered)
m_scenePresencesLock.ExitReadLock(); m_scenePresencesLock.ExitWriteLock();
} }
} }