aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Avatar
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2011-08-31 16:29:51 +0100
committerJustin Clark-Casey (justincc)2011-08-31 16:29:51 +0100
commit32444d98cb13423fdf8c874e4fbb7ea17670d7c5 (patch)
tree4c384f277afc6138a050706eaaf839caeed22d1d /OpenSim/Region/CoreModules/Avatar
parentremove pointless ToArray() call in AttachmentsModule.SaveChangedAttachments() (diff)
downloadopensim-SC-32444d98cb13423fdf8c874e4fbb7ea17670d7c5.zip
opensim-SC-32444d98cb13423fdf8c874e4fbb7ea17670d7c5.tar.gz
opensim-SC-32444d98cb13423fdf8c874e4fbb7ea17670d7c5.tar.bz2
opensim-SC-32444d98cb13423fdf8c874e4fbb7ea17670d7c5.tar.xz
Make SP.Attachments available as sp.GetAttachments() instead.
The approach here, as in other parts of OpenSim, is to return a copy of the list rather than the attachments list itself This prevents callers from forgetting to lock the list when they read it, as was happening in various parts of the codebase. It also improves liveness. This might improve attachment anomolies when performing region crossings.
Diffstat (limited to 'OpenSim/Region/CoreModules/Avatar')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs19
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs10
2 files changed, 12 insertions, 17 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index f4bc495..9e5ce8f 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -136,10 +136,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
136 136
137 public void SaveChangedAttachments(IScenePresence sp) 137 public void SaveChangedAttachments(IScenePresence sp)
138 { 138 {
139 // Need to copy this list because DetachToInventoryPrep mods it 139 foreach (SceneObjectGroup grp in sp.GetAttachments())
140 List<SceneObjectGroup> attachments = new List<SceneObjectGroup>(sp.Attachments);
141
142 foreach (SceneObjectGroup grp in attachments)
143 { 140 {
144 if (grp.HasGroupChanged) // Resizer scripts? 141 if (grp.HasGroupChanged) // Resizer scripts?
145 { 142 {
@@ -273,14 +270,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
273 270
274 // Remove any previous attachments 271 // Remove any previous attachments
275 UUID itemID = UUID.Zero; 272 UUID itemID = UUID.Zero;
276 foreach (SceneObjectGroup grp in sp.Attachments) 273
277 { 274 List<SceneObjectGroup> attachments = sp.GetAttachments(attachmentPt);
278 if (grp.AttachmentPoint == attachmentPt) 275
279 { 276 // At the moment we can only deal with a single attachment
280 itemID = grp.GetFromItemID(); 277 if (attachments.Count != 0)
281 break; 278 itemID = attachments[0].GetFromItemID();
282 }
283 }
284 279
285 if (itemID != UUID.Zero) 280 if (itemID != UUID.Zero)
286 DetachSingleAttachmentToInv(itemID, sp); 281 DetachSingleAttachmentToInv(itemID, sp);
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
index b0146a1..363e258 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
@@ -106,7 +106,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
106 106
107 // Check status on scene presence 107 // Check status on scene presence
108 Assert.That(m_presence.HasAttachments(), Is.True); 108 Assert.That(m_presence.HasAttachments(), Is.True);
109 List<SceneObjectGroup> attachments = m_presence.Attachments; 109 List<SceneObjectGroup> attachments = m_presence.GetAttachments();
110 Assert.That(attachments.Count, Is.EqualTo(1)); 110 Assert.That(attachments.Count, Is.EqualTo(1));
111 SceneObjectGroup attSo = attachments[0]; 111 SceneObjectGroup attSo = attachments[0];
112 Assert.That(attSo.Name, Is.EqualTo(attName)); 112 Assert.That(attSo.Name, Is.EqualTo(attName));
@@ -140,7 +140,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
140 140
141 // Check scene presence status 141 // Check scene presence status
142 Assert.That(m_presence.HasAttachments(), Is.True); 142 Assert.That(m_presence.HasAttachments(), Is.True);
143 List<SceneObjectGroup> attachments = m_presence.Attachments; 143 List<SceneObjectGroup> attachments = m_presence.GetAttachments();
144 Assert.That(attachments.Count, Is.EqualTo(1)); 144 Assert.That(attachments.Count, Is.EqualTo(1));
145 SceneObjectGroup attSo = attachments[0]; 145 SceneObjectGroup attSo = attachments[0];
146 Assert.That(attSo.Name, Is.EqualTo(attName)); 146 Assert.That(attSo.Name, Is.EqualTo(attName));
@@ -174,7 +174,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
174 174
175 // Check scene presence status 175 // Check scene presence status
176 Assert.That(m_presence.HasAttachments(), Is.False); 176 Assert.That(m_presence.HasAttachments(), Is.False);
177 List<SceneObjectGroup> attachments = m_presence.Attachments; 177 List<SceneObjectGroup> attachments = m_presence.GetAttachments();
178 Assert.That(attachments.Count, Is.EqualTo(0)); 178 Assert.That(attachments.Count, Is.EqualTo(0));
179 179
180 // Check appearance status 180 // Check appearance status
@@ -208,7 +208,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
208 208
209 // Check status on scene presence 209 // Check status on scene presence
210 Assert.That(m_presence.HasAttachments(), Is.False); 210 Assert.That(m_presence.HasAttachments(), Is.False);
211 List<SceneObjectGroup> attachments = m_presence.Attachments; 211 List<SceneObjectGroup> attachments = m_presence.GetAttachments();
212 Assert.That(attachments.Count, Is.EqualTo(0)); 212 Assert.That(attachments.Count, Is.EqualTo(0));
213 213
214 // Check item status 214 // Check item status
@@ -237,7 +237,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
237 ScenePresence presence = SceneHelpers.AddScenePresence(scene, acd); 237 ScenePresence presence = SceneHelpers.AddScenePresence(scene, acd);
238 238
239 Assert.That(presence.HasAttachments(), Is.True); 239 Assert.That(presence.HasAttachments(), Is.True);
240 List<SceneObjectGroup> attachments = presence.Attachments; 240 List<SceneObjectGroup> attachments = presence.GetAttachments();
241 241
242 Assert.That(attachments.Count, Is.EqualTo(1)); 242 Assert.That(attachments.Count, Is.EqualTo(1));
243 SceneObjectGroup attSo = attachments[0]; 243 SceneObjectGroup attSo = attachments[0];