diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/InnerScene.cs | 10 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 10 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | 7 |
3 files changed, 22 insertions, 5 deletions
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index 9a720d9..ef98599 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs | |||
@@ -236,7 +236,15 @@ namespace OpenSim.Region.Environment.Scenes | |||
236 | // Don't abort the whole update if one entity happens to give us an exception. | 236 | // Don't abort the whole update if one entity happens to give us an exception. |
237 | try | 237 | try |
238 | { | 238 | { |
239 | m_updateList[i].Update(); | 239 | // A null name signals that this group was deleted before the scheduled update |
240 | // FIXME: This is merely a temporary measure to reduce the incidence of failure, when | ||
241 | // an object has been deleted from a scene before update was processed. | ||
242 | // A more fundamental overhaul of the update mechanism is required to eliminate all | ||
243 | // the race conditions. | ||
244 | if (entity.Name != null) | ||
245 | { | ||
246 | m_updateList[i].Update(); | ||
247 | } | ||
240 | } | 248 | } |
241 | catch (Exception e) | 249 | catch (Exception e) |
242 | { | 250 | { |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 101bac3..8f4c332 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -2676,7 +2676,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
2676 | /// </summary> | 2676 | /// </summary> |
2677 | /// <param name="group"></param> | 2677 | /// <param name="group"></param> |
2678 | public void DeleteSceneObjectGroup(SceneObjectGroup group) | 2678 | public void DeleteSceneObjectGroup(SceneObjectGroup group) |
2679 | { | 2679 | { |
2680 | SceneObjectPart rootPart = (group).GetChildPart(group.UUID); | 2680 | SceneObjectPart rootPart = (group).GetChildPart(group.UUID); |
2681 | if (rootPart.PhysActor != null) | 2681 | if (rootPart.PhysActor != null) |
2682 | { | 2682 | { |
@@ -2693,6 +2693,14 @@ namespace OpenSim.Region.Environment.Scenes | |||
2693 | m_innerScene.RemoveAPrimCount(); | 2693 | m_innerScene.RemoveAPrimCount(); |
2694 | } | 2694 | } |
2695 | group.DeleteParts(); | 2695 | group.DeleteParts(); |
2696 | |||
2697 | // In case anybody else retains a reference to this group, signal deletion by changing the name | ||
2698 | // to null. We can't zero out the UUID because this is taken from the root part, which has already | ||
2699 | // been removed. | ||
2700 | // FIXME: This is a really poor temporary solution, since it still leaves plenty of scope for race | ||
2701 | // conditions where a user deletes an entity while it is being stored. Really, the update | ||
2702 | // code needs a redesign. | ||
2703 | group.Name = null; | ||
2696 | } | 2704 | } |
2697 | 2705 | ||
2698 | /// <summary> | 2706 | /// <summary> |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 38c7e45..90f0708 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | |||
@@ -128,7 +128,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
128 | { | 128 | { |
129 | if( m_rootPart == null ) | 129 | if( m_rootPart == null ) |
130 | { | 130 | { |
131 | throw new NullReferenceException(string.Format("Object {0} has no root part.", m_uuid)); | 131 | throw new NullReferenceException( |
132 | string.Format("[SCENE OBJECT GROUP]: Object {0} has no root part.", m_uuid)); | ||
132 | } | 133 | } |
133 | 134 | ||
134 | return m_rootPart.GroupPosition; | 135 | return m_rootPart.GroupPosition; |
@@ -164,7 +165,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
164 | get { | 165 | get { |
165 | if (m_rootPart == null) | 166 | if (m_rootPart == null) |
166 | { | 167 | { |
167 | m_log.Error("[PRIMGROUP]: Unable to find the rootpart for a LocalId Request!"); | 168 | m_log.Error("[SCENE OBJECT GROUP]: Unable to find the rootpart for a LocalId Request!"); |
168 | return 0; | 169 | return 0; |
169 | } | 170 | } |
170 | 171 | ||
@@ -1948,7 +1949,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1948 | /// Completely delete this group and tell all the scene presences about that deletion. | 1949 | /// Completely delete this group and tell all the scene presences about that deletion. |
1949 | /// </summary> | 1950 | /// </summary> |
1950 | public void DeleteGroup() | 1951 | public void DeleteGroup() |
1951 | { | 1952 | { |
1952 | DetachFromBackup(this); | 1953 | DetachFromBackup(this); |
1953 | 1954 | ||
1954 | lock (m_parts) | 1955 | lock (m_parts) |