aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/XEngine/XEngine.cs')
-rwxr-xr-xOpenSim/Region/ScriptEngine/XEngine/XEngine.cs381
1 files changed, 100 insertions, 281 deletions
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 466c190..78d4ee9 100755
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -28,7 +28,6 @@
28using System; 28using System;
29using System.Collections; 29using System.Collections;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Diagnostics; //for [DebuggerNonUserCode]
32using System.Globalization; 31using System.Globalization;
33using System.IO; 32using System.IO;
34using System.Linq; 33using System.Linq;
@@ -162,8 +161,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
162 private Dictionary<UUID, IScriptInstance> m_Scripts = 161 private Dictionary<UUID, IScriptInstance> m_Scripts =
163 new Dictionary<UUID, IScriptInstance>(); 162 new Dictionary<UUID, IScriptInstance>();
164 163
165 private OpenMetaverse.ReaderWriterLockSlim m_scriptsLock = new OpenMetaverse.ReaderWriterLockSlim();
166
167 // Maps the asset ID to the assembly 164 // Maps the asset ID to the assembly
168 165
169 private Dictionary<UUID, string> m_Assemblies = 166 private Dictionary<UUID, string> m_Assemblies =
@@ -186,71 +183,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
186 IWorkItemResult m_CurrentCompile = null; 183 IWorkItemResult m_CurrentCompile = null;
187 private Dictionary<UUID, int> m_CompileDict = new Dictionary<UUID, int>(); 184 private Dictionary<UUID, int> m_CompileDict = new Dictionary<UUID, int>();
188 185
189 private void lockScriptsForRead(bool locked)
190 {
191 if (locked)
192 {
193 if (m_scriptsLock.RecursiveReadCount > 0)
194 {
195 m_log.Error("[XEngine.m_Scripts] Recursive read lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue.");
196 m_scriptsLock.ExitReadLock();
197 }
198 if (m_scriptsLock.RecursiveWriteCount > 0)
199 {
200 m_log.Error("[XEngine.m_Scripts] Recursive write lock requested. This should not happen and means something needs to be fixed.");
201 m_scriptsLock.ExitWriteLock();
202 }
203
204 while (!m_scriptsLock.TryEnterReadLock(60000))
205 {
206 m_log.Error("[XEngine.m_Scripts] Thread lock detected while trying to aquire READ lock of m_scripts in XEngine. I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed.");
207 if (m_scriptsLock.IsWriteLockHeld)
208 {
209 m_scriptsLock = new OpenMetaverse.ReaderWriterLockSlim();
210 }
211 }
212 }
213 else
214 {
215 if (m_scriptsLock.RecursiveReadCount > 0)
216 {
217 m_scriptsLock.ExitReadLock();
218 }
219 }
220 }
221 private void lockScriptsForWrite(bool locked)
222 {
223 if (locked)
224 {
225 if (m_scriptsLock.RecursiveReadCount > 0)
226 {
227 m_log.Error("[XEngine.m_Scripts] Recursive read lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue.");
228 m_scriptsLock.ExitReadLock();
229 }
230 if (m_scriptsLock.RecursiveWriteCount > 0)
231 {
232 m_log.Error("[XEngine.m_Scripts] Recursive write lock requested. This should not happen and means something needs to be fixed.");
233 m_scriptsLock.ExitWriteLock();
234 }
235
236 while (!m_scriptsLock.TryEnterWriteLock(60000))
237 {
238 m_log.Error("[XEngine.m_Scripts] Thread lock detected while trying to aquire WRITE lock of m_scripts in XEngine. I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed.");
239 if (m_scriptsLock.IsWriteLockHeld)
240 {
241 m_scriptsLock = new OpenMetaverse.ReaderWriterLockSlim();
242 }
243 }
244 }
245 else
246 {
247 if (m_scriptsLock.RecursiveWriteCount > 0)
248 {
249 m_scriptsLock.ExitWriteLock();
250 }
251 }
252 }
253
254 private ScriptEngineConsoleCommands m_consoleCommands; 186 private ScriptEngineConsoleCommands m_consoleCommands;
255 187
256 public string ScriptEngineName 188 public string ScriptEngineName
@@ -782,31 +714,20 @@ namespace OpenSim.Region.ScriptEngine.XEngine
782 { 714 {
783 if (!m_Enabled) 715 if (!m_Enabled)
784 return; 716 return;
785 lockScriptsForRead(true);
786
787 List<IScriptInstance> instancesToDel = new List<IScriptInstance>(m_Scripts.Values);
788 717
789// foreach (IScriptInstance instance in m_Scripts.Values) 718 lock (m_Scripts)
790 foreach (IScriptInstance instance in instancesToDel)
791 { 719 {
792 // Force a final state save 720 m_log.InfoFormat(
793 // 721 "[XEngine]: Shutting down {0} scripts in {1}", m_Scripts.Count, m_Scene.RegionInfo.RegionName);
794 if (m_Assemblies.ContainsKey(instance.AssetID)) 722
723 foreach (IScriptInstance instance in m_Scripts.Values)
795 { 724 {
796<<<<<<< HEAD
797 // Force a final state save 725 // Force a final state save
798 // 726 //
799 try 727 try
800 { 728 {
801 if (instance.StatePersistedHere) 729 if (instance.StatePersistedHere)
802 instance.SaveState(); 730 instance.SaveState();
803=======
804 string assembly = m_Assemblies[instance.AssetID];
805
806 try
807 {
808 instance.SaveState(assembly);
809>>>>>>> avn/ubitvar
810 } 731 }
811 catch (Exception e) 732 catch (Exception e)
812 { 733 {
@@ -816,50 +737,36 @@ namespace OpenSim.Region.ScriptEngine.XEngine
816 instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, World.Name) 737 instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, World.Name)
817 , e); 738 , e);
818 } 739 }
819 }
820 740
821<<<<<<< HEAD
822 // Clear the event queue and abort the instance thread 741 // Clear the event queue and abort the instance thread
823 // 742 //
824 instance.Stop(0, true); 743 instance.Stop(0, true);
825=======
826 // Clear the event queue and abort the instance thread
827 //
828 instance.ClearQueue();
829 instance.Stop(0);
830>>>>>>> avn/ubitvar
831
832 // Release events, timer, etc
833 //
834 instance.DestroyScriptInstance();
835 744
836 // Unload scripts and app domains 745 // Release events, timer, etc
837 // Must be done explicitly because they have infinite 746 //
838 // lifetime 747 instance.DestroyScriptInstance();
839 // 748
840// if (!m_SimulatorShuttingDown) 749 // Unload scripts and app domains.
841 { 750 // Must be done explicitly because they have infinite
842 m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); 751 // lifetime.
843 if (m_DomainScripts[instance.AppDomain].Count == 0) 752 // However, don't bother to do this if the simulator is shutting
753 // down since it takes a long time with many scripts.
754 if (!m_SimulatorShuttingDown)
844 { 755 {
845 m_DomainScripts.Remove(instance.AppDomain); 756 m_DomainScripts[instance.AppDomain].Remove(instance.ItemID);
846 UnloadAppDomain(instance.AppDomain); 757 if (m_DomainScripts[instance.AppDomain].Count == 0)
758 {
759 m_DomainScripts.Remove(instance.AppDomain);
760 UnloadAppDomain(instance.AppDomain);
761 }
847 } 762 }
848 } 763 }
849 764
850// m_Scripts.Clear(); 765 m_Scripts.Clear();
851// m_PrimObjects.Clear(); 766 m_PrimObjects.Clear();
852// m_Assemblies.Clear(); 767 m_Assemblies.Clear();
853// m_DomainScripts.Clear(); 768 m_DomainScripts.Clear();
854 } 769 }
855 lockScriptsForRead(false);
856 lockScriptsForWrite(true);
857 m_Scripts.Clear();
858 lockScriptsForWrite(false);
859 m_PrimObjects.Clear();
860 m_Assemblies.Clear();
861 m_DomainScripts.Clear();
862
863 lock (m_ScriptEngines) 770 lock (m_ScriptEngines)
864 { 771 {
865 m_ScriptEngines.Remove(this); 772 m_ScriptEngines.Remove(this);
@@ -928,7 +835,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
928 835
929 List<IScriptInstance> instances = new List<IScriptInstance>(); 836 List<IScriptInstance> instances = new List<IScriptInstance>();
930 837
931<<<<<<< HEAD
932 lock (m_Scripts) 838 lock (m_Scripts)
933 { 839 {
934 foreach (IScriptInstance instance in m_Scripts.Values) 840 foreach (IScriptInstance instance in m_Scripts.Values)
@@ -946,23 +852,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
946 852
947 foreach (IScriptInstance i in instances) 853 foreach (IScriptInstance i in instances)
948 { 854 {
949=======
950 lockScriptsForRead(true);
951 foreach (IScriptInstance instance in m_Scripts.Values)
952 instances.Add(instance);
953 lockScriptsForRead(false);
954
955 foreach (IScriptInstance i in instances)
956 {
957 string assembly = String.Empty;
958
959
960 if (!m_Assemblies.ContainsKey(i.AssetID))
961 continue;
962 assembly = m_Assemblies[i.AssetID];
963
964
965>>>>>>> avn/ubitvar
966 try 855 try
967 { 856 {
968 i.SaveState(); 857 i.SaveState();
@@ -1393,79 +1282,58 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1393 } 1282 }
1394 1283
1395 ScriptInstance instance = null; 1284 ScriptInstance instance = null;
1396 // Create the object record 1285 lock (m_Scripts)
1397 UUID appDomain = assetID;
1398
1399
1400
1401 lockScriptsForRead(true);
1402 if ((!m_Scripts.ContainsKey(itemID)) ||
1403 (m_Scripts[itemID].AssetID != assetID))
1404 { 1286 {
1405 lockScriptsForRead(false); 1287 // Create the object record
1406 instance = new ScriptInstance(this, part, 1288 if ((!m_Scripts.ContainsKey(itemID)) ||
1407 item, 1289 (m_Scripts[itemID].AssetID != assetID))
1408 startParam, postOnRez, 1290 {
1409 m_MaxScriptQueue); 1291 UUID appDomain = assetID;
1410 1292
1411 if (part.ParentGroup.IsAttachment) 1293 if (part.ParentGroup.IsAttachment)
1412 appDomain = part.ParentGroup.RootPart.UUID; 1294 appDomain = part.ParentGroup.RootPart.UUID;
1413 1295
1414 if (!m_AppDomains.ContainsKey(appDomain)) 1296 if (!m_AppDomains.ContainsKey(appDomain))
1415 {
1416 try
1417 { 1297 {
1418 AppDomainSetup appSetup = new AppDomainSetup(); 1298 try
1419 appSetup.PrivateBinPath = Path.Combine( 1299 {
1420 m_ScriptEnginesPath, 1300 AppDomainSetup appSetup = new AppDomainSetup();
1421 m_Scene.RegionInfo.RegionID.ToString()); 1301 appSetup.PrivateBinPath = Path.Combine(
1302 m_ScriptEnginesPath,
1303 m_Scene.RegionInfo.RegionID.ToString());
1422 1304
1423 Evidence baseEvidence = AppDomain.CurrentDomain.Evidence; 1305 Evidence baseEvidence = AppDomain.CurrentDomain.Evidence;
1424 Evidence evidence = new Evidence(baseEvidence); 1306 Evidence evidence = new Evidence(baseEvidence);
1425 1307
1426 AppDomain sandbox; 1308 AppDomain sandbox;
1427 if (m_AppDomainLoading) 1309 if (m_AppDomainLoading)
1428 {
1429 sandbox = AppDomain.CreateDomain(
1430 m_Scene.RegionInfo.RegionID.ToString(),
1431 evidence, appSetup);
1432 if (m_AppDomains.ContainsKey(appDomain))
1433 { 1310 {
1434 m_AppDomains[appDomain].AssemblyResolve += 1311 sandbox = AppDomain.CreateDomain(
1312 m_Scene.RegionInfo.RegionID.ToString(),
1313 evidence, appSetup);
1314 sandbox.AssemblyResolve +=
1435 new ResolveEventHandler( 1315 new ResolveEventHandler(
1436 AssemblyResolver.OnAssemblyResolve); 1316 AssemblyResolver.OnAssemblyResolve);
1437 if (m_DomainScripts.ContainsKey(appDomain))
1438 {
1439 m_DomainScripts[appDomain].Add(itemID);
1440 }
1441 else
1442 {
1443 m_DomainScripts.Add(appDomain, new List<UUID>());
1444 m_DomainScripts[appDomain].Add(itemID);
1445 }
1446 } 1317 }
1447 else 1318 else
1448 { 1319 {
1449 m_AppDomains.Add(appDomain, sandbox); 1320 sandbox = AppDomain.CurrentDomain;
1450 m_AppDomains[appDomain].AssemblyResolve +=
1451 new ResolveEventHandler(
1452 AssemblyResolver.OnAssemblyResolve);
1453 if (m_DomainScripts.ContainsKey(appDomain))
1454 {
1455 m_DomainScripts[appDomain].Add(itemID);
1456 }
1457 else
1458 {
1459 m_DomainScripts.Add(appDomain, new List<UUID>());
1460 m_DomainScripts[appDomain].Add(itemID);
1461 }
1462
1463 } 1321 }
1322
1323 //PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel();
1324 //AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition();
1325 //PermissionSet sandboxPermissionSet = sandboxPolicy.GetNamedPermissionSet("Internet");
1326 //PolicyStatement sandboxPolicyStatement = new PolicyStatement(sandboxPermissionSet);
1327 //CodeGroup sandboxCodeGroup = new UnionCodeGroup(sandboxMembershipCondition, sandboxPolicyStatement);
1328 //sandboxPolicy.RootCodeGroup = sandboxCodeGroup;
1329 //sandbox.SetAppDomainPolicy(sandboxPolicy);
1330
1331 m_AppDomains[appDomain] = sandbox;
1464 1332
1333 m_DomainScripts[appDomain] = new List<UUID>();
1465 } 1334 }
1466 else 1335 catch (Exception e)
1467 { 1336 {
1468<<<<<<< HEAD
1469 m_log.ErrorFormat("[XEngine] Exception creating app domain:\n {0}", e.ToString()); 1337 m_log.ErrorFormat("[XEngine] Exception creating app domain:\n {0}", e.ToString());
1470 m_ScriptErrorMessage += "Exception creating app domain:\n"; 1338 m_ScriptErrorMessage += "Exception creating app domain:\n";
1471 m_ScriptFailCount++; 1339 m_ScriptFailCount++;
@@ -1474,12 +1342,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1474 m_AddingAssemblies[assemblyPath]--; 1342 m_AddingAssemblies[assemblyPath]--;
1475 } 1343 }
1476 return false; 1344 return false;
1477=======
1478 sandbox = AppDomain.CurrentDomain;
1479>>>>>>> avn/ubitvar
1480 } 1345 }
1346 }
1347 m_DomainScripts[appDomain].Add(itemID);
1481 1348
1482<<<<<<< HEAD
1483 IScript scriptObj = null; 1349 IScript scriptObj = null;
1484 EventWaitHandle coopSleepHandle; 1350 EventWaitHandle coopSleepHandle;
1485 bool coopTerminationForThisScript; 1351 bool coopTerminationForThisScript;
@@ -1611,52 +1477,26 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1611 scriptObj, coopSleepHandle, assemblyPath, 1477 scriptObj, coopSleepHandle, assemblyPath,
1612 Path.Combine(ScriptEnginePath, World.RegionInfo.RegionID.ToString()), stateSource, coopTerminationForThisScript)) 1478 Path.Combine(ScriptEnginePath, World.RegionInfo.RegionID.ToString()), stateSource, coopTerminationForThisScript))
1613 return false; 1479 return false;
1614=======
1615// if (!instance.Load(m_AppDomains[appDomain], assembly, stateSource))
1616// return false;
1617>>>>>>> avn/ubitvar
1618 1480
1619 m_AppDomains[appDomain] = sandbox; 1481// if (DebugLevel >= 1)
1482// m_log.DebugFormat(
1483// "[XEngine] Loaded script {0}.{1}, item UUID {2}, prim UUID {3} @ {4}.{5}",
1484// part.ParentGroup.RootPart.Name, item.Name, itemID, part.UUID,
1485// part.ParentGroup.RootPart.AbsolutePosition, part.ParentGroup.Scene.RegionInfo.RegionName);
1620 1486
1621 m_DomainScripts[appDomain] = new List<UUID>(); 1487 if (presence != null)
1622 }
1623 catch (Exception e)
1624 { 1488 {
1625 m_log.ErrorFormat("[XEngine] Exception creating app domain:\n {0}", e.ToString()); 1489 ShowScriptSaveResponse(item.OwnerID,
1626 m_ScriptErrorMessage += "Exception creating app domain:\n"; 1490 assetID, "Compile successful", true);
1627 m_ScriptFailCount++;
1628 lock (m_AddingAssemblies)
1629 {
1630 m_AddingAssemblies[assembly]--;
1631 }
1632 return false;
1633 } 1491 }
1634 }
1635 1492
1493 instance.AppDomain = appDomain;
1494 instance.LineMap = linemap;
1636 1495
1637 if (!instance.Load(m_AppDomains[appDomain], assembly, stateSource)) 1496 m_Scripts[itemID] = instance;
1638 return false;
1639// m_log.DebugFormat(
1640// "[XEngine] Loaded script {0}.{1}, script UUID {2}, prim UUID {3} @ {4}.{5}",
1641// part.ParentGroup.RootPart.Name, item.Name, assetID, part.UUID,
1642// part.ParentGroup.RootPart.AbsolutePosition, part.ParentGroup.Scene.RegionInfo.RegionName);
1643
1644 if (presence != null)
1645 {
1646 ShowScriptSaveResponse(item.OwnerID,
1647 assetID, "Compile successful", true);
1648 } 1497 }
1649
1650 instance.AppDomain = appDomain;
1651 instance.LineMap = linemap;
1652 lockScriptsForWrite(true);
1653 m_Scripts[itemID] = instance;
1654 lockScriptsForWrite(false);
1655 }
1656 else
1657 {
1658 lockScriptsForRead(false);
1659 } 1498 }
1499
1660 lock (m_PrimObjects) 1500 lock (m_PrimObjects)
1661 { 1501 {
1662 if (!m_PrimObjects.ContainsKey(localID)) 1502 if (!m_PrimObjects.ContainsKey(localID))
@@ -1674,7 +1514,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1674 m_AddingAssemblies[assemblyPath]--; 1514 m_AddingAssemblies[assemblyPath]--;
1675 } 1515 }
1676 1516
1677 if (instance!=null) 1517 if (instance != null)
1678 instance.Init(); 1518 instance.Init();
1679 1519
1680 bool runIt; 1520 bool runIt;
@@ -1697,28 +1537,19 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1697 m_CompileDict.Remove(itemID); 1537 m_CompileDict.Remove(itemID);
1698 } 1538 }
1699 1539
1700 lockScriptsForRead(true); 1540 IScriptInstance instance = null;
1701 // Do we even have it?
1702 if (!m_Scripts.ContainsKey(itemID))
1703 {
1704 lockScriptsForRead(false);
1705 return;
1706 }
1707 1541
1708<<<<<<< HEAD 1542 lock (m_Scripts)
1709 instance.Stop(m_WaitForEventCompletionOnScriptStop, true); 1543 {
1710======= 1544 // Do we even have it?
1711 IScriptInstance instance=m_Scripts[itemID]; 1545 if (!m_Scripts.ContainsKey(itemID))
1712 lockScriptsForRead(false); 1546 return;
1713 lockScriptsForWrite(true);
1714 m_Scripts.Remove(itemID);
1715 lockScriptsForWrite(false);
1716 instance.ClearQueue();
1717 1547
1718 instance.Stop(m_WaitForEventCompletionOnScriptStop); 1548 instance = m_Scripts[itemID];
1549 m_Scripts.Remove(itemID);
1550 }
1719 1551
1720// bool objectRemoved = false; 1552 instance.Stop(m_WaitForEventCompletionOnScriptStop, true);
1721>>>>>>> avn/ubitvar
1722 1553
1723 lock (m_PrimObjects) 1554 lock (m_PrimObjects)
1724 { 1555 {
@@ -1740,26 +1571,17 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1740 1571
1741 instance.DestroyScriptInstance(); 1572 instance.DestroyScriptInstance();
1742 1573
1743 if (m_DomainScripts.ContainsKey(instance.AppDomain)) 1574 m_DomainScripts[instance.AppDomain].Remove(instance.ItemID);
1575 if (m_DomainScripts[instance.AppDomain].Count == 0)
1744 { 1576 {
1745 m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); 1577 m_DomainScripts.Remove(instance.AppDomain);
1746 if (m_DomainScripts[instance.AppDomain].Count == 0) 1578 UnloadAppDomain(instance.AppDomain);
1747 {
1748 m_DomainScripts.Remove(instance.AppDomain);
1749 UnloadAppDomain(instance.AppDomain);
1750 }
1751 } 1579 }
1752 1580
1753 ObjectRemoved handlerObjectRemoved = OnObjectRemoved; 1581 ObjectRemoved handlerObjectRemoved = OnObjectRemoved;
1754 if (handlerObjectRemoved != null) 1582 if (handlerObjectRemoved != null)
1755 { 1583 handlerObjectRemoved(instance.ObjectID);
1756 SceneObjectPart part = m_Scene.GetSceneObjectPart(localID);
1757 if (part != null)
1758 handlerObjectRemoved(part.UUID);
1759 }
1760 1584
1761 CleanAssemblies();
1762
1763 ScriptRemoved handlerScriptRemoved = OnScriptRemoved; 1585 ScriptRemoved handlerScriptRemoved = OnScriptRemoved;
1764 if (handlerScriptRemoved != null) 1586 if (handlerScriptRemoved != null)
1765 handlerScriptRemoved(itemID); 1587 handlerScriptRemoved(itemID);
@@ -2020,14 +1842,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
2020 private IScriptInstance GetInstance(UUID itemID) 1842 private IScriptInstance GetInstance(UUID itemID)
2021 { 1843 {
2022 IScriptInstance instance; 1844 IScriptInstance instance;
2023 lockScriptsForRead(true); 1845 lock (m_Scripts)
2024 if (!m_Scripts.ContainsKey(itemID))
2025 { 1846 {
2026 lockScriptsForRead(false); 1847 if (!m_Scripts.ContainsKey(itemID))
2027 return null; 1848 return null;
1849 instance = m_Scripts[itemID];
2028 } 1850 }
2029 instance = m_Scripts[itemID];
2030 lockScriptsForRead(false);
2031 return instance; 1851 return instance;
2032 } 1852 }
2033 1853
@@ -2049,7 +1869,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
2049 return instance != null && instance.Running; 1869 return instance != null && instance.Running;
2050 } 1870 }
2051 1871
2052 [DebuggerNonUserCode]
2053 public void ApiResetScript(UUID itemID) 1872 public void ApiResetScript(UUID itemID)
2054 { 1873 {
2055 IScriptInstance instance = GetInstance(itemID); 1874 IScriptInstance instance = GetInstance(itemID);
@@ -2134,7 +1953,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
2134 return instance != null ? instance.GetDetectID(idx) : UUID.Zero; 1953 return instance != null ? instance.GetDetectID(idx) : UUID.Zero;
2135 } 1954 }
2136 1955
2137 [DebuggerNonUserCode]
2138 public void SetState(UUID itemID, string newState) 1956 public void SetState(UUID itemID, string newState)
2139 { 1957 {
2140 IScriptInstance instance = GetInstance(itemID); 1958 IScriptInstance instance = GetInstance(itemID);
@@ -2155,10 +1973,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
2155 1973
2156 List<IScriptInstance> instances = new List<IScriptInstance>(); 1974 List<IScriptInstance> instances = new List<IScriptInstance>();
2157 1975
2158 lockScriptsForRead(true); 1976 lock (m_Scripts)
2159 foreach (IScriptInstance instance in m_Scripts.Values) 1977 {
1978 foreach (IScriptInstance instance in m_Scripts.Values)
2160 instances.Add(instance); 1979 instances.Add(instance);
2161 lockScriptsForRead(false); 1980 }
2162 1981
2163 foreach (IScriptInstance i in instances) 1982 foreach (IScriptInstance i in instances)
2164 { 1983 {