mirror of
https://github.com/opensim/opensim.git
synced 2026-08-08 02:05:34 +08:00
Change object cleanup again. Make scene object directories more robust and
prevent deleted SOP's from sticking around
This commit is contained in:
@@ -104,7 +104,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
protected internal Dictionary<uint, SceneObjectGroup> SceneObjectGroupsByLocalID = new Dictionary<uint, SceneObjectGroup>();
|
||||
protected internal Dictionary<UUID, SceneObjectGroup> SceneObjectGroupsByFullID = new Dictionary<UUID, SceneObjectGroup>();
|
||||
private readonly Object m_dictionary_lock = new Object();
|
||||
|
||||
private Object m_updateLock = new Object();
|
||||
|
||||
@@ -150,11 +149,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
m_scenePresencesLock.ExitWriteLock();
|
||||
}
|
||||
|
||||
lock (m_dictionary_lock)
|
||||
{
|
||||
lock (SceneObjectGroupsByFullID)
|
||||
SceneObjectGroupsByFullID.Clear();
|
||||
lock (SceneObjectGroupsByLocalID)
|
||||
SceneObjectGroupsByLocalID.Clear();
|
||||
}
|
||||
|
||||
Entities.Clear();
|
||||
}
|
||||
@@ -385,15 +383,17 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
OnObjectCreate(sceneObject);
|
||||
}
|
||||
|
||||
lock (m_dictionary_lock)
|
||||
lock (SceneObjectGroupsByFullID)
|
||||
{
|
||||
SceneObjectGroupsByFullID[sceneObject.UUID] = sceneObject;
|
||||
foreach (SceneObjectPart part in sceneObject.Children.Values)
|
||||
SceneObjectGroupsByFullID[part.UUID] = sceneObject;
|
||||
}
|
||||
lock (SceneObjectGroupsByLocalID)
|
||||
{
|
||||
SceneObjectGroupsByLocalID[sceneObject.LocalId] = sceneObject;
|
||||
foreach (SceneObjectPart part in sceneObject.Children.Values)
|
||||
{
|
||||
SceneObjectGroupsByFullID[part.UUID] = sceneObject;
|
||||
SceneObjectGroupsByLocalID[part.LocalId] = sceneObject;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -408,24 +408,32 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
if (Entities.ContainsKey(uuid))
|
||||
{
|
||||
SceneObjectGroup grp = (SceneObjectGroup)Entities[uuid];
|
||||
|
||||
if (!resultOfObjectLinked)
|
||||
{
|
||||
m_numPrim -= ((SceneObjectGroup) Entities[uuid]).Children.Count;
|
||||
|
||||
if ((((SceneObjectGroup)Entities[uuid]).RootPart.Flags & PrimFlags.Physics) == PrimFlags.Physics)
|
||||
{
|
||||
RemovePhysicalPrim(((SceneObjectGroup)Entities[uuid]).Children.Count);
|
||||
}
|
||||
if ((grp.RootPart.Flags & PrimFlags.Physics) == PrimFlags.Physics)
|
||||
RemovePhysicalPrim(grp.Children.Count);
|
||||
}
|
||||
|
||||
if (OnObjectRemove != null)
|
||||
OnObjectRemove(Entities[uuid]);
|
||||
|
||||
lock (m_dictionary_lock)
|
||||
lock (SceneObjectGroupsByFullID)
|
||||
{
|
||||
SceneObjectGroupsByFullID.Remove(uuid);
|
||||
SceneObjectGroupsByLocalID.Remove(((SceneObjectGroup)Entities[uuid]).LocalId);
|
||||
foreach (SceneObjectPart part in grp.Children.Values)
|
||||
SceneObjectGroupsByFullID.Remove(part.UUID);
|
||||
SceneObjectGroupsByFullID.Remove(grp.RootPart.UUID);
|
||||
}
|
||||
lock (SceneObjectGroupsByLocalID)
|
||||
{
|
||||
foreach (SceneObjectPart part in grp.Children.Values)
|
||||
SceneObjectGroupsByLocalID.Remove(part.LocalId);
|
||||
SceneObjectGroupsByLocalID.Remove(grp.RootPart.LocalId);
|
||||
}
|
||||
|
||||
Entities.Remove(uuid);
|
||||
//SceneObjectGroup part;
|
||||
//((part.RootPart.Flags & PrimFlags.Physics) == PrimFlags.Physics)
|
||||
@@ -884,7 +892,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
if (SceneObjectGroupsByLocalID.TryGetValue(localID, out sog))
|
||||
{
|
||||
return sog;
|
||||
if (sog.HasChildPrim(localID))
|
||||
return sog;
|
||||
SceneObjectGroupsByLocalID.Remove(localID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -920,7 +930,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
if (SceneObjectGroupsByFullID.TryGetValue(fullID, out sog))
|
||||
{
|
||||
return sog;
|
||||
if (sog.Children.ContainsKey(fullID))
|
||||
return sog;
|
||||
SceneObjectGroupsByFullID.Remove(fullID);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user