From ca0de93d9a54afc59298454db9ca49fb5d35c12b Mon Sep 17 00:00:00 2001
From: Teravus Ovares
Date: Wed, 17 Dec 2008 15:30:26 +0000
Subject: * Adding some locks to XEngine's m_PrimObjects which were prone to
 'the collection was modified'

---
 OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 57 +++++++++++++++-----------
 1 file changed, 34 insertions(+), 23 deletions(-)

diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 3c3eb19..6ad8923 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -572,11 +572,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine
                     m_Scripts[itemID] = instance;
                 }
 
-                if (!m_PrimObjects.ContainsKey(localID))
-                    m_PrimObjects[localID] = new List<UUID>();
+                lock (m_PrimObjects)
+                {
+                    if (!m_PrimObjects.ContainsKey(localID))
+                        m_PrimObjects[localID] = new List<UUID>();
 
-                if (!m_PrimObjects[localID].Contains(itemID))
-                    m_PrimObjects[localID].Add(itemID);
+                    if (!m_PrimObjects[localID].Contains(itemID))
+                        m_PrimObjects[localID].Add(itemID);
+
+                }
 
                 if (!m_Assemblies.ContainsKey(assetID))
                     m_Assemblies[assetID] = assembly;
@@ -604,17 +608,20 @@ namespace OpenSim.Region.ScriptEngine.XEngine
                 if (part != null)
                     part.RemoveScriptEvents(itemID);
 
-                // Remove the script from it's prim
-                if (m_PrimObjects.ContainsKey(localID))
+                lock (m_PrimObjects)
                 {
-                    // Remove inventory item record
-                    if (m_PrimObjects[localID].Contains(itemID))
-                        m_PrimObjects[localID].Remove(itemID);
-
-                    // If there are no more scripts, remove prim
-                    if (m_PrimObjects[localID].Count == 0)
+                    // Remove the script from it's prim
+                    if (m_PrimObjects.ContainsKey(localID))
                     {
-                        m_PrimObjects.Remove(localID);
+                        // Remove inventory item record
+                        if (m_PrimObjects[localID].Contains(itemID))
+                            m_PrimObjects[localID].Remove(itemID);
+
+                        // If there are no more scripts, remove prim
+                        if (m_PrimObjects[localID].Count == 0)
+                        {
+                            m_PrimObjects.Remove(localID);
+                        }
                     }
                 }
 
@@ -749,19 +756,23 @@ namespace OpenSim.Region.ScriptEngine.XEngine
         public bool PostObjectEvent(uint localID, EventParams p)
         {
             bool result = false;
-
-            if (!m_PrimObjects.ContainsKey(localID))
-                return false;
-
-            foreach (UUID itemID in m_PrimObjects[localID])
+            
+            lock (m_PrimObjects)
             {
-                if (m_Scripts.ContainsKey(itemID))
+                if (!m_PrimObjects.ContainsKey(localID))
+                    return false;
+
+            
+                foreach (UUID itemID in m_PrimObjects[localID])
                 {
-                    IScriptInstance instance = m_Scripts[itemID];
-                    if (instance != null)
+                    if (m_Scripts.ContainsKey(itemID))
                     {
-                        instance.PostEvent(p);
-                        result = true;
+                        IScriptInstance instance = m_Scripts[itemID];
+                        if (instance != null)
+                        {
+                            instance.PostEvent(p);
+                            result = true;
+                        }
                     }
                 }
             }
-- 
cgit v1.1