aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Framework/ISceneObject.cs2
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs7
-rw-r--r--OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs66
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineBasicTests.cs4
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineCrossingTests.cs195
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs51
7 files changed, 266 insertions, 61 deletions
diff --git a/OpenSim/Framework/ISceneObject.cs b/OpenSim/Framework/ISceneObject.cs
index afac9b8..754b77b 100644
--- a/OpenSim/Framework/ISceneObject.cs
+++ b/OpenSim/Framework/ISceneObject.cs
@@ -32,6 +32,8 @@ namespace OpenSim.Framework
32{ 32{
33 public interface ISceneObject 33 public interface ISceneObject
34 { 34 {
35 string Name { get; }
36
35 UUID UUID { get; } 37 UUID UUID { get; }
36 38
37 /// <summary> 39 /// <summary>
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index a3368fb..ff7a062 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -255,6 +255,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
255 255
256 public void CopyAttachments(AgentData ad, IScenePresence sp) 256 public void CopyAttachments(AgentData ad, IScenePresence sp)
257 { 257 {
258// m_log.DebugFormat("[ATTACHMENTS MODULE]: Copying attachment data into {0} in {1}", sp.Name, m_scene.Name);
259
258 if (ad.AttachmentObjects != null && ad.AttachmentObjects.Count > 0) 260 if (ad.AttachmentObjects != null && ad.AttachmentObjects.Count > 0)
259 { 261 {
260 lock (sp.AttachmentsSyncLock) 262 lock (sp.AttachmentsSyncLock)
@@ -265,6 +267,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
265 { 267 {
266 ((SceneObjectGroup)so).LocalId = 0; 268 ((SceneObjectGroup)so).LocalId = 0;
267 ((SceneObjectGroup)so).RootPart.ClearUpdateSchedule(); 269 ((SceneObjectGroup)so).RootPart.ClearUpdateSchedule();
270
271// m_log.DebugFormat(
272// "[ATTACHMENTS MODULE]: Copying script state with {0} bytes for object {1} for {2} in {3}",
273// ad.AttachmentObjectStates[i].Length, so.Name, sp.Name, m_scene.Name);
274
268 so.SetState(ad.AttachmentObjectStates[i++], m_scene); 275 so.SetState(ad.AttachmentObjectStates[i++], m_scene);
269 m_scene.IncomingCreateObject(Vector3.Zero, so); 276 m_scene.IncomingCreateObject(Vector3.Zero, so);
270 } 277 }
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
index b9a217b..1097efb 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
@@ -222,7 +222,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
222 void SetVars(Dictionary<string, object> vars); 222 void SetVars(Dictionary<string, object> vars);
223 DetectParams GetDetectParams(int idx); 223 DetectParams GetDetectParams(int idx);
224 UUID GetDetectID(int idx); 224 UUID GetDetectID(int idx);
225 void SaveState(string assembly); 225 void SaveState();
226 void DestroyScriptInstance(); 226 void DestroyScriptInstance();
227 227
228 IScriptApi GetApi(string name); 228 IScriptApi GetApi(string name);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 637c556..b983be9 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -71,7 +71,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
71 private bool m_TimerQueued; 71 private bool m_TimerQueued;
72 private DateTime m_EventStart; 72 private DateTime m_EventStart;
73 private bool m_InEvent; 73 private bool m_InEvent;
74 private string m_Assembly; 74 private string m_assemblyPath;
75 private string m_dataPath;
75 private string m_CurrentEvent = String.Empty; 76 private string m_CurrentEvent = String.Empty;
76 private bool m_InSelfDelete; 77 private bool m_InSelfDelete;
77 private int m_MaxScriptQueue; 78 private int m_MaxScriptQueue;
@@ -244,12 +245,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
244 /// </summary> 245 /// </summary>
245 /// <param name='dom'></param> 246 /// <param name='dom'></param>
246 /// <param name='assembly'></param> 247 /// <param name='assembly'></param>
248 /// <param name='dataPath'>
249 /// Path for all script associated data (state, etc.). In a multi-region set up
250 /// with all scripts loading into the same AppDomain this may not be the same place as the DLL itself.
251 /// </param>
247 /// <param name='stateSource'></param> 252 /// <param name='stateSource'></param>
248 /// <returns>false if load failed, true if suceeded</returns> 253 /// <returns>false if load failed, true if suceeded</returns>
249 public bool Load(AppDomain dom, Assembly scriptAssembly, StateSource stateSource) 254 public bool Load(AppDomain dom, Assembly scriptAssembly, string dataPath, StateSource stateSource)
250 { 255 {
251 //m_Assembly = scriptAssembly.CodeBase; 256 m_assemblyPath = scriptAssembly.Location;
252 m_Assembly = scriptAssembly.Location; 257 m_dataPath = dataPath;
253 m_stateSource = stateSource; 258 m_stateSource = stateSource;
254 259
255 try 260 try
@@ -270,14 +275,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
270 constructorParams = null; 275 constructorParams = null;
271 } 276 }
272 277
273// m_log.DebugFormat(
274// "[SCRIP
275// scriptType.FullName, m_Assembly, Engine.World.Name);
276
277 if (dom != System.AppDomain.CurrentDomain) 278 if (dom != System.AppDomain.CurrentDomain)
278 m_Script 279 m_Script
279 = (IScript)dom.CreateInstanceAndUnwrap( 280 = (IScript)dom.CreateInstanceAndUnwrap(
280 Path.GetFileNameWithoutExtension(m_Assembly), 281 Path.GetFileNameWithoutExtension(m_assemblyPath),
281 scriptType.FullName, 282 scriptType.FullName,
282 false, 283 false,
283 BindingFlags.Default, 284 BindingFlags.Default,
@@ -305,7 +306,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
305 { 306 {
306 m_log.ErrorFormat( 307 m_log.ErrorFormat(
307 "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Error loading assembly {6}. Exception {7}{8}", 308 "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Error loading assembly {6}. Exception {7}{8}",
308 ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, m_Assembly, e.Message, e.StackTrace); 309 ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, scriptAssembly.Location, e.Message, e.StackTrace);
309 310
310 return false; 311 return false;
311 } 312 }
@@ -340,10 +341,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
340 341
341 m_SaveState = true; 342 m_SaveState = true;
342 343
343 string savedState = Path.Combine(Path.GetDirectoryName(m_Assembly), ItemID.ToString() + ".state"); 344 string savedState = Path.Combine(m_dataPath, ItemID.ToString() + ".state");
344 345
345 if (File.Exists(savedState)) 346 if (File.Exists(savedState))
346 { 347 {
348// m_log.DebugFormat(
349// "[SCRIPT INSTANCE]: Found state for script {0} for {1} ({2}) at {3} in {4}",
350// ItemID, savedState, Part.Name, Part.ParentGroup.Name, Part.ParentGroup.Scene.Name);
351
347 string xml = String.Empty; 352 string xml = String.Empty;
348 353
349 try 354 try
@@ -385,12 +390,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
385 m_startedFromSavedState = true; 390 m_startedFromSavedState = true;
386 } 391 }
387 } 392 }
388 else 393// else
389 { 394// {
390 m_log.WarnFormat( 395// m_log.WarnFormat(
391 "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Unable to load script state file {6}. Memory limit exceeded.", 396// "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Unable to load script state file {6}. Memory limit exceeded.",
392 ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, savedState); 397// ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, savedState);
393 } 398// }
394 } 399 }
395 catch (Exception e) 400 catch (Exception e)
396 { 401 {
@@ -401,11 +406,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
401 } 406 }
402// else 407// else
403// { 408// {
404// ScenePresence presence = Engine.World.GetScenePresence(part.OwnerID); 409// m_log.DebugFormat(
405 410// "[SCRIPT INSTANCE]: Did not find state for script {0} for {1} ({2}) at {3} in {4}",
406// if (presence != null && (!postOnRez)) 411// ItemID, savedState, Part.Name, Part.ParentGroup.Name, Part.ParentGroup.Scene.Name);
407// presence.ControllingClient.SendAgentAlertMessage("Compile successful", false);
408
409// } 412// }
410 413
411 return true; 414 return true;
@@ -498,8 +501,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
498 501
499 public void RemoveState() 502 public void RemoveState()
500 { 503 {
501 string savedState = Path.Combine(Path.GetDirectoryName(m_Assembly), 504 string savedState = Path.Combine(m_dataPath, ItemID.ToString() + ".state");
502 ItemID.ToString() + ".state"); 505
506// m_log.DebugFormat(
507// "[SCRIPT INSTANCE]: Deleting state {0} for script {1} (id {2}) in part {3} (id {4}) in object {5} in {6}.",
508// savedState, ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name);
503 509
504 try 510 try
505 { 511 {
@@ -822,8 +828,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
822 if (Engine.World.PipeEventsForScript(LocalID) || 828 if (Engine.World.PipeEventsForScript(LocalID) ||
823 data.EventName == "control") // Don't freeze avies! 829 data.EventName == "control") // Don't freeze avies!
824 { 830 {
825 // m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}", 831// m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}",
826 // PrimName, ScriptName, data.EventName, State); 832// PrimName, ScriptName, data.EventName, State);
827 833
828 try 834 try
829 { 835 {
@@ -849,7 +855,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
849 // This will be the very first event we deliver 855 // This will be the very first event we deliver
850 // (state_entry) in default state 856 // (state_entry) in default state
851 // 857 //
852 SaveState(m_Assembly); 858 SaveState();
853 859
854 m_SaveState = false; 860 m_SaveState = false;
855 } 861 }
@@ -1043,7 +1049,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
1043 return m_DetectParams[idx].Key; 1049 return m_DetectParams[idx].Key;
1044 } 1050 }
1045 1051
1046 public void SaveState(string assembly) 1052 public void SaveState()
1047 { 1053 {
1048 // If we're currently in an event, just tell it to save upon return 1054 // If we're currently in an event, just tell it to save upon return
1049 // 1055 //
@@ -1065,7 +1071,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
1065 { 1071 {
1066 try 1072 try
1067 { 1073 {
1068 using (FileStream fs = File.Create(Path.Combine(Path.GetDirectoryName(assembly), ItemID.ToString() + ".state"))) 1074 using (FileStream fs = File.Create(Path.Combine(m_dataPath, ItemID.ToString() + ".state")))
1069 { 1075 {
1070 Byte[] buf = Util.UTF8NoBomEncoding.GetBytes(xml); 1076 Byte[] buf = Util.UTF8NoBomEncoding.GetBytes(xml);
1071 fs.Write(buf, 0, buf.Length); 1077 fs.Write(buf, 0, buf.Length);
@@ -1149,7 +1155,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
1149 1155
1150 public string GetAssemblyName() 1156 public string GetAssemblyName()
1151 { 1157 {
1152 return m_Assembly; 1158 return m_assemblyPath;
1153 } 1159 }
1154 1160
1155 public string GetXMLState() 1161 public string GetXMLState()
diff --git a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineBasicTests.cs b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineBasicTests.cs
index fe15157..878e571 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineBasicTests.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineBasicTests.cs
@@ -40,10 +40,10 @@ using OpenSim.Tests.Common;
40namespace OpenSim.Region.ScriptEngine.XEngine.Tests 40namespace OpenSim.Region.ScriptEngine.XEngine.Tests
41{ 41{
42 /// <summary> 42 /// <summary>
43 /// XEngine tests. 43 /// Basic XEngine tests.
44 /// </summary> 44 /// </summary>
45 [TestFixture] 45 [TestFixture]
46 public class XEngineTest : OpenSimTestCase 46 public class XEngineBasicTests : OpenSimTestCase
47 { 47 {
48 private TestScene m_scene; 48 private TestScene m_scene;
49 private XEngine m_xEngine; 49 private XEngine m_xEngine;
diff --git a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineCrossingTests.cs b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineCrossingTests.cs
new file mode 100644
index 0000000..587695f
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineCrossingTests.cs
@@ -0,0 +1,195 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Threading;
30using Nini.Config;
31using NUnit.Framework;
32using OpenMetaverse;
33using OpenSim.Framework;
34using OpenSim.Region.CoreModules.Framework.EntityTransfer;
35using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation;
36using OpenSim.Region.Framework.Scenes;
37using OpenSim.Region.ScriptEngine.Shared;
38using OpenSim.Tests.Common;
39
40namespace OpenSim.Region.ScriptEngine.XEngine.Tests
41{
42 /// <summary>
43 /// XEngine tests connected with crossing scripts between regions.
44 /// </summary>
45 [TestFixture]
46 public class XEngineCrossingTests : OpenSimTestCase
47 {
48 [TestFixtureSetUp]
49 public void FixtureInit()
50 {
51 // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
52 Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest;
53 }
54
55 [TestFixtureTearDown]
56 public void TearDown()
57 {
58 // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
59 // threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression
60 // tests really shouldn't).
61 Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
62 }
63
64 /// <summary>
65 /// Test script state preservation when a script crosses between regions on the same simulator.
66 /// </summary>
67 [Test]
68 public void TestScriptCrossOnSameSimulator()
69 {
70 TestHelpers.InMethod();
71// TestHelpers.EnableLogging();
72
73 UUID userId = TestHelpers.ParseTail(0x1);
74 int sceneObjectIdTail = 0x2;
75
76 EntityTransferModule etmA = new EntityTransferModule();
77 EntityTransferModule etmB = new EntityTransferModule();
78 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
79 XEngine xEngineA = new XEngine();
80 XEngine xEngineB = new XEngine();
81 xEngineA.DebugLevel = 1;
82 xEngineB.DebugLevel = 1;
83
84 IConfigSource configSource = new IniConfigSource();
85
86 IConfig startupConfig = configSource.AddConfig("Startup");
87 startupConfig.Set("DefaultScriptEngine", "XEngine");
88
89 IConfig xEngineConfig = configSource.AddConfig("XEngine");
90 xEngineConfig.Set("Enabled", "true");
91 xEngineConfig.Set("StartDelay", "0");
92
93 // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call
94 // to AssemblyResolver.OnAssemblyResolve fails.
95 xEngineConfig.Set("AppDomainLoading", "false");
96
97 IConfig modulesConfig = configSource.AddConfig("Modules");
98 modulesConfig.Set("EntityTransferModule", etmA.Name);
99 modulesConfig.Set("SimulationServices", lscm.Name);
100
101 SceneHelpers sh = new SceneHelpers();
102 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000, configSource);
103 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1000, 999, configSource);
104
105 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, configSource, lscm);
106 SceneHelpers.SetupSceneModules(sceneA, configSource, etmA, xEngineA);
107 SceneHelpers.SetupSceneModules(sceneB, configSource, etmB, xEngineB);
108 sceneA.StartScripts();
109 sceneB.StartScripts();
110
111 SceneObjectGroup soSceneA = SceneHelpers.AddSceneObject(sceneA, 1, userId, "so1-", sceneObjectIdTail);
112 soSceneA.AbsolutePosition = new Vector3(128, 10, 20);
113
114 // CREATE SCRIPT TODO
115 InventoryItemBase scriptItemSceneA = new InventoryItemBase();
116 // itemTemplate.ID = itemId;
117 scriptItemSceneA.Name = "script1";
118 scriptItemSceneA.Folder = soSceneA.UUID;
119 scriptItemSceneA.InvType = (int)InventoryType.LSL;
120
121 AutoResetEvent chatEvent = new AutoResetEvent(false);
122 OSChatMessage messageReceived = null;
123 sceneA.EventManager.OnChatFromWorld += (s, m) => { messageReceived = m; chatEvent.Set(); };
124
125 sceneA.RezNewScript(userId, scriptItemSceneA,
126@"integer c = 0;
127
128default
129{
130 state_entry()
131 {
132 llSay(0, ""Script running"");
133 }
134
135 changed(integer change)
136 {
137 llSay(0, ""Changed"");
138 }
139
140 touch_start(integer n)
141 {
142 c = c + 1;
143 llSay(0, (string)c);
144 }
145}");
146
147 chatEvent.WaitOne(60000);
148
149 Assert.That(messageReceived, Is.Not.Null, "No chat message received.");
150 Assert.That(messageReceived.Message, Is.EqualTo("Script running"));
151
152 {
153 // XXX: Should not be doing this so directly. Should call some variant of EventManager.touch() instead.
154 DetectParams[] det = new DetectParams[1];
155 det[0] = new DetectParams();
156 det[0].Key = userId;
157 det[0].Populate(sceneA);
158
159 EventParams ep = new EventParams("touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, det);
160
161 xEngineA.PostObjectEvent(soSceneA.LocalId, ep);
162 chatEvent.WaitOne(60000);
163
164 Assert.That(messageReceived.Message, Is.EqualTo("1"));
165 }
166
167 sceneB.EventManager.OnChatFromWorld += (s, m) => { messageReceived = m; chatEvent.Set(); };
168
169 // Cross with a negative value
170 soSceneA.AbsolutePosition = new Vector3(128, -10, 20);
171
172 chatEvent.WaitOne(60000);
173 Assert.That(messageReceived.Message, Is.EqualTo("Changed"));
174
175 // TEST sending event to moved prim and output
176 {
177 SceneObjectGroup soSceneB = sceneB.GetSceneObjectGroup(soSceneA.Name);
178 TaskInventoryItem scriptItemSceneB = soSceneB.RootPart.Inventory.GetInventoryItem(scriptItemSceneA.Name);
179
180 // XXX: Should not be doing this so directly. Should call some variant of EventManager.touch() instead.
181 DetectParams[] det = new DetectParams[1];
182 det[0] = new DetectParams();
183 det[0].Key = userId;
184 det[0].Populate(sceneB);
185
186 EventParams ep = new EventParams("touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, det);
187
188 xEngineB.PostObjectEvent(soSceneB.LocalId, ep);
189 chatEvent.WaitOne(60000);
190
191 Assert.That(messageReceived.Message, Is.EqualTo("2"));
192 }
193 }
194 }
195} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index ccd5d99..71ed989 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -716,22 +716,17 @@ namespace OpenSim.Region.ScriptEngine.XEngine
716 { 716 {
717 // Force a final state save 717 // Force a final state save
718 // 718 //
719 if (m_Assemblies.ContainsKey(instance.AssetID)) 719 try
720 { 720 {
721 string assembly = m_Assemblies[instance.AssetID]; 721 instance.SaveState();
722 722 }
723 try 723 catch (Exception e)
724 { 724 {
725 instance.SaveState(assembly); 725 m_log.Error(
726 } 726 string.Format(
727 catch (Exception e) 727 "[XEngine]: Failed final state save for script {0}.{1}, item UUID {2}, prim UUID {3} in {4}. Exception ",
728 { 728 instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, World.Name)
729 m_log.Error( 729 , e);
730 string.Format(
731 "[XEngine]: Failed final state save for script {0}.{1}, item UUID {2}, prim UUID {3} in {4}. Exception ",
732 instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, World.Name)
733 , e);
734 }
735 } 730 }
736 731
737 // Clear the event queue and abort the instance thread 732 // Clear the event queue and abort the instance thread
@@ -840,18 +835,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
840 835
841 foreach (IScriptInstance i in instances) 836 foreach (IScriptInstance i in instances)
842 { 837 {
843 string assembly = String.Empty;
844
845 lock (m_Scripts)
846 {
847 if (!m_Assemblies.ContainsKey(i.AssetID))
848 continue;
849 assembly = m_Assemblies[i.AssetID];
850 }
851
852 try 838 try
853 { 839 {
854 i.SaveState(assembly); 840 i.SaveState();
855 } 841 }
856 catch (Exception e) 842 catch (Exception e)
857 { 843 {
@@ -1180,7 +1166,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1180 lock (m_AddingAssemblies) 1166 lock (m_AddingAssemblies)
1181 { 1167 {
1182 m_Compiler.PerformScriptCompile(script, assetID.ToString(), item.OwnerID, out assemblyPath, out linemap); 1168 m_Compiler.PerformScriptCompile(script, assetID.ToString(), item.OwnerID, out assemblyPath, out linemap);
1183 1169
1170// m_log.DebugFormat(
1171// "[XENGINE]: Found assembly path {0} onrez {1} in {2}",
1172// assemblyPath, item.ItemID, World.Name);
1173
1184 if (!m_AddingAssemblies.ContainsKey(assemblyPath)) { 1174 if (!m_AddingAssemblies.ContainsKey(assemblyPath)) {
1185 m_AddingAssemblies[assemblyPath] = 1; 1175 m_AddingAssemblies[assemblyPath] = 1;
1186 } else { 1176 } else {
@@ -1373,7 +1363,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1373 startParam, postOnRez, 1363 startParam, postOnRez,
1374 m_MaxScriptQueue); 1364 m_MaxScriptQueue);
1375 1365
1376 if (!instance.Load(m_AppDomains[appDomain], scriptAssembly, stateSource)) 1366 if (!instance.Load(
1367 m_AppDomains[appDomain], scriptAssembly,
1368 Path.Combine(ScriptEnginePath, World.RegionInfo.RegionID.ToString()), stateSource))
1377 return false; 1369 return false;
1378 1370
1379// if (DebugLevel >= 1) 1371// if (DebugLevel >= 1)
@@ -1604,7 +1596,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1604 1596
1605 IScriptInstance instance = (ScriptInstance) parms; 1597 IScriptInstance instance = (ScriptInstance) parms;
1606 1598
1607 //m_log.DebugFormat("[XEngine]: Processing event for {0}", instance); 1599// m_log.DebugFormat("[XEngine]: Processing event for {0}", instance);
1608 1600
1609 return instance.EventProcessor(); 1601 return instance.EventProcessor();
1610 } 1602 }
@@ -2200,6 +2192,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
2200 m_log.ErrorFormat("[XEngine]: Error whilst writing state file {0}, {1}", statepath, ex.Message); 2192 m_log.ErrorFormat("[XEngine]: Error whilst writing state file {0}, {1}", statepath, ex.Message);
2201 } 2193 }
2202 2194
2195// m_log.DebugFormat(
2196// "[XEngine]: Wrote state for script item with ID {0} at {1} in {2}", itemID, statepath, m_Scene.Name);
2197
2203 return true; 2198 return true;
2204 } 2199 }
2205 2200