change scenegraph locking

0.9.1.0-post-fixes
UbitUmarov 2019-01-06 01:44:37 +00:00
parent c5604d3857
commit 3e49e13249
1 changed files with 70 additions and 53 deletions

View File

@ -150,9 +150,14 @@ namespace OpenSim.Region.Framework.Scenes
protected internal void Close()
{
m_scenePresencesLock.EnterWriteLock();
bool entered = false;
try
{
try { }
finally
{
m_scenePresencesLock.EnterWriteLock();
entered = true;
m_scenePresenceMap = new ConcurrentDictionary<UUID, ScenePresence>();
m_scenePresenceLocalIDMap = new ConcurrentDictionary<uint, ScenePresence>();
m_scenePresenceArray = new List<ScenePresence>();
@ -162,8 +167,10 @@ namespace OpenSim.Region.Framework.Scenes
_PhyScene.OnPhysicsCrash -= physicsBasedCrash;
_PhyScene = null;
}
}
finally
{
if(entered)
m_scenePresencesLock.ExitWriteLock();
}
@ -707,6 +714,9 @@ namespace OpenSim.Region.Framework.Scenes
bool entered = false;
try
{
try{ }
finally
{
m_scenePresencesLock.EnterWriteLock();
entered = true;
@ -735,6 +745,7 @@ namespace OpenSim.Region.Framework.Scenes
++m_spArrayVersion;
}
}
finally
{
if(entered)
@ -758,6 +769,9 @@ namespace OpenSim.Region.Framework.Scenes
bool entered = false;
try
{
try { }
finally
{
m_scenePresencesLock.EnterWriteLock();
entered = true;
@ -774,6 +788,7 @@ namespace OpenSim.Region.Framework.Scenes
m_log.WarnFormat("[SCENE GRAPH]: Tried to remove non-existent scene presence with agent ID {0} from scene ScenePresences list", agentID);
}
}
}
finally
{
if(entered)
@ -905,7 +920,11 @@ namespace OpenSim.Region.Framework.Scenes
protected internal List<ScenePresence> GetScenePresences()
{
bool entered = false;
List<ScenePresence> ret = new List<ScenePresence>();
try
{
try{ }
finally
{
m_scenePresencesLock.EnterWriteLock();
entered = true;
@ -914,17 +933,15 @@ namespace OpenSim.Region.Framework.Scenes
m_scenePresenceArray = new List<ScenePresence>(m_scenePresenceMap.Values);
m_spArrayLastVersion = m_spArrayVersion;
}
return m_scenePresenceArray;
ret = m_scenePresenceArray;
}
catch
{
return new List<ScenePresence>();
}
finally
{
if(entered)
m_scenePresencesLock.ExitWriteLock();
}
return ret;
}
/// <summary>