aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs98
1 files changed, 74 insertions, 24 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index a869a6a..891e453 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -252,7 +252,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
252 /// <param name='dom'></param> 252 /// <param name='dom'></param>
253 /// <param name='assembly'></param> 253 /// <param name='assembly'></param>
254 /// <param name='stateSource'></param> 254 /// <param name='stateSource'></param>
255 public void Load(AppDomain dom, string assembly, StateSource stateSource) 255 /// <returns>false if load failed, true if suceeded</returns>
256 public bool Load(AppDomain dom, string assembly, StateSource stateSource)
256 { 257 {
257 m_Assembly = assembly; 258 m_Assembly = assembly;
258 m_stateSource = stateSource; 259 m_stateSource = stateSource;
@@ -267,14 +268,56 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
267 268
268 try 269 try
269 { 270 {
271 object[] constructorParams;
272
273 Assembly scriptAssembly = dom.Load(Path.GetFileNameWithoutExtension(assembly));
274 Type scriptType = scriptAssembly.GetType("SecondLife.XEngineScript");
275
276 if (scriptType != null)
277 {
278 constructorParams = new object[] { m_coopSleepHandle };
279 }
280 else if (!m_coopTermination)
281 {
282 scriptType = scriptAssembly.GetType("SecondLife.Script");
283 constructorParams = null;
284 }
285 else
286 {
287 m_log.ErrorFormat(
288 "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. You must remove all existing {6}* script DLL files before using enabling co-op termination"
289 + ", either by setting DeleteScriptsOnStartup = true in [XEngine] for one run"
290 + " or by deleting these files manually.",
291 ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, assembly);
292
293 return false;
294 }
295
296// m_log.DebugFormat(
297// "[SCRIPT INSTANCE]: Looking to load {0} from assembly {1} in {2}",
298// scriptType.FullName, Path.GetFileNameWithoutExtension(assembly), Engine.World.Name);
299
270 if (dom != System.AppDomain.CurrentDomain) 300 if (dom != System.AppDomain.CurrentDomain)
271 m_Script = (IScript)dom.CreateInstanceAndUnwrap( 301 m_Script
302 = (IScript)dom.CreateInstanceAndUnwrap(
272 Path.GetFileNameWithoutExtension(assembly), 303 Path.GetFileNameWithoutExtension(assembly),
273 "SecondLife.Script"); 304 scriptType.FullName,
305 false,
306 BindingFlags.Default,
307 null,
308 constructorParams,
309 null,
310 null);
274 else 311 else
275 m_Script = (IScript)Assembly.Load( 312 m_Script
276 Path.GetFileNameWithoutExtension(assembly)).CreateInstance( 313 = (IScript)scriptAssembly.CreateInstance(
277 "SecondLife.Script"); 314 scriptType.FullName,
315 false,
316 BindingFlags.Default,
317 null,
318 constructorParams,
319 null,
320 null);
278 321
279 //ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass); 322 //ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
280 //RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass); 323 //RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
@@ -283,8 +326,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
283 catch (Exception e) 326 catch (Exception e)
284 { 327 {
285 m_log.ErrorFormat( 328 m_log.ErrorFormat(
286 "[SCRIPT INSTANCE]: Error loading assembly {0}. Exception {1}{2}", 329 "[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}",
287 assembly, e.Message, e.StackTrace); 330 ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, assembly, e.Message, e.StackTrace);
331
332 return false;
288 } 333 }
289 334
290 try 335 try
@@ -302,10 +347,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
302 catch (Exception e) 347 catch (Exception e)
303 { 348 {
304 m_log.ErrorFormat( 349 m_log.ErrorFormat(
305 "[SCRIPT INSTANCE]: Error loading script instance from assembly {0}. Exception {1}{2}", 350 "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Error initializing script instance. Exception {6}{7}",
306 assembly, e.Message, e.StackTrace); 351 ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, e.Message, e.StackTrace);
307 352
308 return; 353 return false;
309 } 354 }
310 355
311 m_SaveState = true; 356 m_SaveState = true;
@@ -358,15 +403,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
358 else 403 else
359 { 404 {
360 m_log.WarnFormat( 405 m_log.WarnFormat(
361 "[SCRIPT INSTANCE]: Unable to load script state file {0} for script {1} {2} in {3} {4} (assembly {5}). Memory limit exceeded", 406 "[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.",
362 savedState, ScriptName, ItemID, PrimName, ObjectID, assembly); 407 ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, savedState);
363 } 408 }
364 } 409 }
365 catch (Exception e) 410 catch (Exception e)
366 { 411 {
367 m_log.ErrorFormat( 412 m_log.ErrorFormat(
368 "[SCRIPT INSTANCE]: Unable to load script state file {0} for script {1} {2} in {3} {4} (assembly {5}). XML is {6}. Exception {7}{8}", 413 "[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}. XML is {7}. Exception {8}{9}",
369 savedState, ScriptName, ItemID, PrimName, ObjectID, assembly, xml, e.Message, e.StackTrace); 414 ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, savedState, xml, e.Message, e.StackTrace);
370 } 415 }
371 } 416 }
372// else 417// else
@@ -377,6 +422,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
377// presence.ControllingClient.SendAgentAlertMessage("Compile successful", false); 422// presence.ControllingClient.SendAgentAlertMessage("Compile successful", false);
378 423
379// } 424// }
425
426 return true;
380 } 427 }
381 428
382 public void Init() 429 public void Init()
@@ -560,9 +607,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
560 } 607 }
561 else 608 else
562 { 609 {
563 m_log.DebugFormat( 610 if (DebugLevel >= 1)
564 "[SCRIPT INSTANCE]: Co-operatively stopping script {0} {1} in {2} {3}", 611 m_log.DebugFormat(
565 ScriptName, ItemID, PrimName, ObjectID); 612 "[SCRIPT INSTANCE]: Co-operatively stopping script {0} {1} in {2} {3}",
613 ScriptName, ItemID, PrimName, ObjectID);
566 614
567 // This will terminate the event on next handle check by the script. 615 // This will terminate the event on next handle check by the script.
568 m_coopSleepHandle.Set(); 616 m_coopSleepHandle.Set();
@@ -571,9 +619,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
571 // checking is implemented. May want to allow a shorter timeout option later. 619 // checking is implemented. May want to allow a shorter timeout option later.
572 if (workItem.Wait(TimeSpan.MaxValue)) 620 if (workItem.Wait(TimeSpan.MaxValue))
573 { 621 {
574 m_log.DebugFormat( 622 if (DebugLevel >= 1)
575 "[SCRIPT INSTANCE]: Co-operatively stopped script {0} {1} in {2} {3}", 623 m_log.DebugFormat(
576 ScriptName, ItemID, PrimName, ObjectID); 624 "[SCRIPT INSTANCE]: Co-operatively stopped script {0} {1} in {2} {3}",
625 ScriptName, ItemID, PrimName, ObjectID);
577 626
578 return true; 627 return true;
579 } 628 }
@@ -894,9 +943,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
894 } 943 }
895 else if ((e is TargetInvocationException) && (e.InnerException is ScriptCoopStopException)) 944 else if ((e is TargetInvocationException) && (e.InnerException is ScriptCoopStopException))
896 { 945 {
897 m_log.DebugFormat( 946 if (DebugLevel >= 1)
898 "[SCRIPT INSTANCE]: Script {0}.{1} in event {2}, state {3} stopped co-operatively.", 947 m_log.DebugFormat(
899 PrimName, ScriptName, data.EventName, State); 948 "[SCRIPT INSTANCE]: Script {0}.{1} in event {2}, state {3} stopped co-operatively.",
949 PrimName, ScriptName, data.EventName, State);
900 } 950 }
901 } 951 }
902 } 952 }