Experimental change to use an immutable array for iterating ScenePresences, avoiding locking and copying the list each time it is accessed

This commit is contained in:
John Hurliman
2009-10-23 01:02:36 -07:00
parent 96d53f11e5
commit 588361e2a2
13 changed files with 312 additions and 288 deletions

View File

@@ -7227,13 +7227,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public LSL_Integer llGetNumberOfPrims()
{
m_host.AddScriptLPS(1);
List<ScenePresence> presences = World.GetScenePresences();
if (presences.Count == 0)
ScenePresence[] presences = World.GetScenePresences();
if (presences.Length == 0)
return 0;
int avatarCount = 0;
foreach (ScenePresence presence in presences)
for (int i = 0; i < presences.Length; i++)
{
ScenePresence presence = presences[i];
if (!presence.IsChildAgent && presence.ParentID != 0)
{
if (m_host.ParentGroup.HasChildPrim(presence.ParentID))

View File

@@ -404,7 +404,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
private List<SensedEntity> doAgentSensor(SenseRepeatClass ts)
{
List<ScenePresence> Presences;
List<ScenePresence> presences;
List<SensedEntity> sensedEntities = new List<SensedEntity>();
// If this is an avatar sense by key try to get them directly
@@ -414,16 +414,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
ScenePresence p = m_CmdManager.m_ScriptEngine.World.GetScenePresence(ts.keyID);
if (p == null)
return sensedEntities;
Presences = new List<ScenePresence>();
Presences.Add(p);
presences = new List<ScenePresence>();
presences.Add(p);
}
else
{
Presences = m_CmdManager.m_ScriptEngine.World.GetScenePresences();
presences = new List<ScenePresence>(m_CmdManager.m_ScriptEngine.World.GetScenePresences());
}
// If nobody about quit fast
if (Presences.Count == 0)
if (presences.Count == 0)
return sensedEntities;
SceneObjectPart SensePoint = ts.host;
@@ -440,8 +440,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
Vector3 toRegionPos;
double dis;
foreach (ScenePresence presence in Presences)
for (int i = 0; i < presences.Count; i++)
{
ScenePresence presence = presences[i];
bool keep = true;
if (presence.IsDeleted)