diff options
author | Justin Clark-Casey (justincc) | 2011-09-12 21:57:22 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2011-09-12 21:57:22 +0100 |
commit | ea0f78c97152d3aa54822487e5343ca2db0b47b9 (patch) | |
tree | 1496c7d6ebbed346209f1513f2affa3f1ba6f62a /OpenSim/Region/Framework/Scenes | |
parent | lock AvatarAppearance.m_attachments when we use it (diff) | |
download | opensim-SC-ea0f78c97152d3aa54822487e5343ca2db0b47b9.zip opensim-SC-ea0f78c97152d3aa54822487e5343ca2db0b47b9.tar.gz opensim-SC-ea0f78c97152d3aa54822487e5343ca2db0b47b9.tar.bz2 opensim-SC-ea0f78c97152d3aa54822487e5343ca2db0b47b9.tar.xz |
Start locking entire add/remove operations on an IScenePresence.AttachmentsSyncLock object
Attach and detach packets are processed asynchronously when received from a viewer.
Bugs like http://opensimulator.org/mantis/view.php?id=5644 indicate that in some situations (such as attaching/detaching entire folders of objects at once), there are race conditions between these threads.
Since multiple data structures need to be updated on attach/detach, it's not enough to lock the individual collections.
Therefore, this commit introduces a new IScenePresence.AttachmentsSyncLock which add/remove operations lock on.
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index d65d78d..86e1e11 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -120,6 +120,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
120 | /// </remarks> | 120 | /// </remarks> |
121 | protected List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>(); | 121 | protected List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>(); |
122 | 122 | ||
123 | public Object AttachmentsSyncLock { get; private set; } | ||
124 | |||
123 | private Dictionary<UUID, ScriptControllers> scriptedcontrols = new Dictionary<UUID, ScriptControllers>(); | 125 | private Dictionary<UUID, ScriptControllers> scriptedcontrols = new Dictionary<UUID, ScriptControllers>(); |
124 | private ScriptControlled IgnoredControls = ScriptControlled.CONTROL_ZERO; | 126 | private ScriptControlled IgnoredControls = ScriptControlled.CONTROL_ZERO; |
125 | private ScriptControlled LastCommands = ScriptControlled.CONTROL_ZERO; | 127 | private ScriptControlled LastCommands = ScriptControlled.CONTROL_ZERO; |
@@ -709,6 +711,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
709 | public ScenePresence( | 711 | public ScenePresence( |
710 | IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance, PresenceType type) | 712 | IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance, PresenceType type) |
711 | { | 713 | { |
714 | AttachmentsSyncLock = new Object(); | ||
715 | |||
712 | m_sendCourseLocationsMethod = SendCoarseLocationsDefault; | 716 | m_sendCourseLocationsMethod = SendCoarseLocationsDefault; |
713 | m_sceneViewer = new SceneViewer(this); | 717 | m_sceneViewer = new SceneViewer(this); |
714 | m_animator = new ScenePresenceAnimator(this); | 718 | m_animator = new ScenePresenceAnimator(this); |