aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/XEngine/XEngine.cs')
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs102
1 files changed, 56 insertions, 46 deletions
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 61b16f4..30ce79b 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -63,7 +63,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
63 private IConfig m_ScriptConfig; 63 private IConfig m_ScriptConfig;
64 private ICompiler m_Compiler; 64 private ICompiler m_Compiler;
65 private int m_MinThreads; 65 private int m_MinThreads;
66 private int m_MaxThreads; 66 private int m_MaxThreads ;
67 private int m_IdleTimeout; 67 private int m_IdleTimeout;
68 private int m_StackSize; 68 private int m_StackSize;
69 private int m_SleepTime; 69 private int m_SleepTime;
@@ -72,8 +72,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
72 private bool m_Enabled = false; 72 private bool m_Enabled = false;
73 private bool m_InitialStartup = true; 73 private bool m_InitialStartup = true;
74 74
75 // disable warning: need to keep a reference to XEngine.EventManager 75// disable warning: need to keep a reference to XEngine.EventManager
76 // alive to avoid it being garbage collected 76// alive to avoid it being garbage collected
77#pragma warning disable 414 77#pragma warning disable 414
78 private EventManager m_EventManager; 78 private EventManager m_EventManager;
79#pragma warning restore 414 79#pragma warning restore 414
@@ -85,8 +85,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
85 85
86 // Maps the local id to the script inventory items in it 86 // Maps the local id to the script inventory items in it
87 87
88 private Dictionary<uint, List<UUID>> m_PrimObjects = 88 private Dictionary<uint, List<UUID> > m_PrimObjects =
89 new Dictionary<uint, List<UUID>>(); 89 new Dictionary<uint, List<UUID> >();
90 90
91 // Maps the UUID above to the script instance 91 // Maps the UUID above to the script instance
92 92
@@ -105,8 +105,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
105 105
106 // List the scripts running in each appdomain 106 // List the scripts running in each appdomain
107 107
108 private Dictionary<UUID, List<UUID>> m_DomainScripts = 108 private Dictionary<UUID, List<UUID> > m_DomainScripts =
109 new Dictionary<UUID, List<UUID>>(); 109 new Dictionary<UUID, List<UUID> >();
110 110
111 private Queue m_CompileQueue = new Queue(100); 111 private Queue m_CompileQueue = new Queue(100);
112 IWorkItemResult m_CurrentCompile = null; 112 IWorkItemResult m_CurrentCompile = null;
@@ -152,7 +152,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
152 152
153 if (m_ScriptConfig == null) 153 if (m_ScriptConfig == null)
154 { 154 {
155 // m_log.ErrorFormat("[XEngine] No script configuration found. Scripts disabled"); 155// m_log.ErrorFormat("[XEngine] No script configuration found. Scripts disabled");
156 return; 156 return;
157 } 157 }
158 158
@@ -172,7 +172,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
172 m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100); 172 m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100);
173 m_IdleTimeout = m_ScriptConfig.GetInt("IdleTimeout", 60); 173 m_IdleTimeout = m_ScriptConfig.GetInt("IdleTimeout", 60);
174 string priority = m_ScriptConfig.GetString("Priority", "BelowNormal"); 174 string priority = m_ScriptConfig.GetString("Priority", "BelowNormal");
175 m_MaxScriptQueue = m_ScriptConfig.GetInt("MaxScriptEventQueue", 300); 175 m_MaxScriptQueue = m_ScriptConfig.GetInt("MaxScriptEventQueue",300);
176 m_StackSize = m_ScriptConfig.GetInt("ThreadStackSize", 262144); 176 m_StackSize = m_ScriptConfig.GetInt("ThreadStackSize", 262144);
177 m_SleepTime = m_ScriptConfig.GetInt("MaintenanceInterval", 10) * 1000; 177 m_SleepTime = m_ScriptConfig.GetInt("MaintenanceInterval", 10) * 1000;
178 178
@@ -239,7 +239,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
239 if (m_SleepTime > 0) 239 if (m_SleepTime > 0)
240 { 240 {
241 m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoMaintenance), 241 m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoMaintenance),
242 new Object[] { m_SleepTime }); 242 new Object[]{ m_SleepTime });
243 } 243 }
244 244
245 if (m_SaveTime > 0) 245 if (m_SaveTime > 0)
@@ -268,7 +268,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
268 if (saveTime > 0) 268 if (saveTime > 0)
269 System.Threading.Thread.Sleep(saveTime); 269 System.Threading.Thread.Sleep(saveTime);
270 270
271 // m_log.Debug("[XEngine] Backing up script states"); 271// m_log.Debug("[XEngine] Backing up script states");
272 272
273 List<IScriptInstance> instances = new List<IScriptInstance>(); 273 List<IScriptInstance> instances = new List<IScriptInstance>();
274 274
@@ -319,7 +319,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
319 System.Threading.Thread.Sleep(sleepTime); 319 System.Threading.Thread.Sleep(sleepTime);
320 320
321 m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoMaintenance), 321 m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoMaintenance),
322 new Object[] { sleepTime }); 322 new Object[]{ sleepTime });
323 323
324 return 0; 324 return 0;
325 } 325 }
@@ -351,12 +351,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
351 int colon = firstline.IndexOf(':'); 351 int colon = firstline.IndexOf(':');
352 if (firstline.Length > 2 && firstline.Substring(0, 2) == "//" && colon != -1) 352 if (firstline.Length > 2 && firstline.Substring(0, 2) == "//" && colon != -1)
353 { 353 {
354 string engineName = firstline.Substring(2, colon - 2); 354 string engineName = firstline.Substring(2, colon-2);
355 355
356 if (names.Contains(engineName)) 356 if (names.Contains(engineName))
357 { 357 {
358 engine = engineName; 358 engine = engineName;
359 script = "//" + script.Substring(script.IndexOf(':') + 1); 359 script = "//" + script.Substring(script.IndexOf(':')+1);
360 } 360 }
361 else 361 else
362 { 362 {
@@ -365,21 +365,21 @@ namespace OpenSim.Region.ScriptEngine.XEngine
365 SceneObjectPart part = 365 SceneObjectPart part =
366 m_Scene.GetSceneObjectPart( 366 m_Scene.GetSceneObjectPart(
367 localID); 367 localID);
368 368
369 TaskInventoryItem item = 369 TaskInventoryItem item =
370 part.Inventory.GetInventoryItem(itemID); 370 part.Inventory.GetInventoryItem(itemID);
371 371
372 ScenePresence presence = 372 ScenePresence presence =
373 m_Scene.GetScenePresence( 373 m_Scene.GetScenePresence(
374 item.OwnerID); 374 item.OwnerID);
375 375
376 if (presence != null) 376 if (presence != null)
377 { 377 {
378 presence.ControllingClient.SendAgentAlertMessage( 378 presence.ControllingClient.SendAgentAlertMessage(
379 "Selected engine unavailable. " + 379 "Selected engine unavailable. "+
380 "Running script on " + 380 "Running script on "+
381 ScriptEngineName, 381 ScriptEngineName,
382 false); 382 false);
383 } 383 }
384 } 384 }
385 } 385 }
@@ -389,7 +389,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
389 if (engine != ScriptEngineName) 389 if (engine != ScriptEngineName)
390 return; 390 return;
391 391
392 Object[] parms = new Object[] { localID, itemID, script, startParam, postOnRez, (StateSource)stateSource }; 392 Object[] parms = new Object[]{localID, itemID, script, startParam, postOnRez, (StateSource)stateSource};
393 393
394 if (stateSource == (int)StateSource.ScriptedRez) 394 if (stateSource == (int)StateSource.ScriptedRez)
395 { 395 {
@@ -453,7 +453,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
453 Object[] p = (Object[])parm; 453 Object[] p = (Object[])parm;
454 uint localID = (uint)p[0]; 454 uint localID = (uint)p[0];
455 UUID itemID = (UUID)p[1]; 455 UUID itemID = (UUID)p[1];
456 string script = (string)p[2]; 456 string script =(string)p[2];
457 int startParam = (int)p[3]; 457 int startParam = (int)p[3];
458 bool postOnRez = (bool)p[4]; 458 bool postOnRez = (bool)p[4];
459 StateSource stateSource = (StateSource)p[5]; 459 StateSource stateSource = (StateSource)p[5];
@@ -469,7 +469,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
469 { 469 {
470 Log.Error("[Script] SceneObjectPart unavailable. Script NOT started."); 470 Log.Error("[Script] SceneObjectPart unavailable. Script NOT started.");
471 return false; 471 return false;
472 } 472 }
473 473
474 TaskInventoryItem item = part.Inventory.GetInventoryItem(itemID); 474 TaskInventoryItem item = part.Inventory.GetInventoryItem(itemID);
475 if (item == null) 475 if (item == null)
@@ -477,8 +477,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
477 477
478 UUID assetID = item.AssetID; 478 UUID assetID = item.AssetID;
479 479
480 // m_log.DebugFormat("[XEngine] Compiling script {0} ({1})", 480// m_log.DebugFormat("[XEngine] Compiling script {0} ({1})",
481 // item.Name, itemID.ToString()); 481// item.Name, itemID.ToString());
482 482
483 ScenePresence presence = m_Scene.GetScenePresence(item.OwnerID); 483 ScenePresence presence = m_Scene.GetScenePresence(item.OwnerID);
484 484
@@ -509,7 +509,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
509 } 509 }
510 catch (Exception e2) // LEGIT: User Scripting 510 catch (Exception e2) // LEGIT: User Scripting
511 { 511 {
512 m_log.Error("[XEngine]: " + 512 m_log.Error("[XEngine]: "+
513 "Error displaying error in-world: " + 513 "Error displaying error in-world: " +
514 e2.ToString()); 514 e2.ToString());
515 m_log.Error("[XEngine]: " + 515 m_log.Error("[XEngine]: " +
@@ -537,17 +537,27 @@ namespace OpenSim.Region.ScriptEngine.XEngine
537 try 537 try
538 { 538 {
539 AppDomainSetup appSetup = new AppDomainSetup(); 539 AppDomainSetup appSetup = new AppDomainSetup();
540 // appSetup.ApplicationBase = Path.Combine( 540// appSetup.ApplicationBase = Path.Combine(
541 // "ScriptEngines", 541// "ScriptEngines",
542 // m_Scene.RegionInfo.RegionID.ToString()); 542// m_Scene.RegionInfo.RegionID.ToString());
543 543
544 Evidence baseEvidence = AppDomain.CurrentDomain.Evidence; 544 Evidence baseEvidence = AppDomain.CurrentDomain.Evidence;
545 Evidence evidence = new Evidence(baseEvidence); 545 Evidence evidence = new Evidence(baseEvidence);
546 546
547 m_AppDomains[appDomain] = 547 AppDomain sandbox =
548 AppDomain.CreateDomain( 548 AppDomain.CreateDomain(
549 m_Scene.RegionInfo.RegionID.ToString(), 549 m_Scene.RegionInfo.RegionID.ToString(),
550 evidence, appSetup); 550 evidence, appSetup);
551/*
552 PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel();
553 AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition();
554 PermissionSet sandboxPermissionSet = sandboxPolicy.GetNamedPermissionSet("Internet");
555 PolicyStatement sandboxPolicyStatement = new PolicyStatement(sandboxPermissionSet);
556 CodeGroup sandboxCodeGroup = new UnionCodeGroup(sandboxMembershipCondition, sandboxPolicyStatement);
557 sandboxPolicy.RootCodeGroup = sandboxCodeGroup;
558 sandbox.SetAppDomainPolicy(sandboxPolicy);
559*/
560 m_AppDomains[appDomain] = sandbox;
551 561
552 m_AppDomains[appDomain].AssemblyResolve += 562 m_AppDomains[appDomain].AssemblyResolve +=
553 new ResolveEventHandler( 563 new ResolveEventHandler(
@@ -603,7 +613,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
603 if (!m_Scripts.ContainsKey(itemID)) 613 if (!m_Scripts.ContainsKey(itemID))
604 return; 614 return;
605 615
606 IScriptInstance instance = m_Scripts[itemID]; 616 IScriptInstance instance=m_Scripts[itemID];
607 m_Scripts.Remove(itemID); 617 m_Scripts.Remove(itemID);
608 618
609 instance.ClearQueue(); 619 instance.ClearQueue();
@@ -675,17 +685,17 @@ namespace OpenSim.Region.ScriptEngine.XEngine
675 685
676 foreach (UUID assetID in assetIDList) 686 foreach (UUID assetID in assetIDList)
677 { 687 {
678 // m_log.DebugFormat("[XEngine] Removing unreferenced assembly {0}", m_Assemblies[assetID]); 688// m_log.DebugFormat("[XEngine] Removing unreferenced assembly {0}", m_Assemblies[assetID]);
679 try 689 try
680 { 690 {
681 if (File.Exists(m_Assemblies[assetID])) 691 if (File.Exists(m_Assemblies[assetID]))
682 File.Delete(m_Assemblies[assetID]); 692 File.Delete(m_Assemblies[assetID]);
683 693
684 if (File.Exists(m_Assemblies[assetID] + ".state")) 694 if (File.Exists(m_Assemblies[assetID]+".state"))
685 File.Delete(m_Assemblies[assetID] + ".state"); 695 File.Delete(m_Assemblies[assetID]+".state");
686 696
687 if (File.Exists(m_Assemblies[assetID] + ".mdb")) 697 if (File.Exists(m_Assemblies[assetID]+".mdb"))
688 File.Delete(m_Assemblies[assetID] + ".mdb"); 698 File.Delete(m_Assemblies[assetID]+".mdb");
689 } 699 }
690 catch (Exception) 700 catch (Exception)
691 { 701 {
@@ -703,7 +713,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
703 713
704 AppDomain.Unload(domain); 714 AppDomain.Unload(domain);
705 domain = null; 715 domain = null;
706 // m_log.DebugFormat("[XEngine] Unloaded app domain {0}", id.ToString()); 716// m_log.DebugFormat("[XEngine] Unloaded app domain {0}", id.ToString());
707 } 717 }
708 } 718 }
709 719
@@ -735,8 +745,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
735 return new XWorkItem(m_ThreadPool.QueueWorkItem( 745 return new XWorkItem(m_ThreadPool.QueueWorkItem(
736 new WorkItemCallback(this.ProcessEventHandler), 746 new WorkItemCallback(this.ProcessEventHandler),
737 parms)); 747 parms));
738 } 748 }
739 749
740 /// <summary> 750 /// <summary>
741 /// Process a previously posted script event. 751 /// Process a previously posted script event.
742 /// </summary> 752 /// </summary>
@@ -747,8 +757,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
747 CultureInfo USCulture = new CultureInfo("en-US"); 757 CultureInfo USCulture = new CultureInfo("en-US");
748 Thread.CurrentThread.CurrentCulture = USCulture; 758 Thread.CurrentThread.CurrentCulture = USCulture;
749 759
750 IScriptInstance instance = (ScriptInstance)parms; 760 IScriptInstance instance = (ScriptInstance) parms;
751 761
752 //m_log.DebugFormat("[XENGINE]: Processing event for {0}", instance); 762 //m_log.DebugFormat("[XENGINE]: Processing event for {0}", instance);
753 763
754 return instance.EventProcessor(); 764 return instance.EventProcessor();
@@ -763,13 +773,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine
763 public bool PostObjectEvent(uint localID, EventParams p) 773 public bool PostObjectEvent(uint localID, EventParams p)
764 { 774 {
765 bool result = false; 775 bool result = false;
766 776
767 lock (m_PrimObjects) 777 lock (m_PrimObjects)
768 { 778 {
769 if (!m_PrimObjects.ContainsKey(localID)) 779 if (!m_PrimObjects.ContainsKey(localID))
770 return false; 780 return false;
771 781
772 782
773 foreach (UUID itemID in m_PrimObjects[localID]) 783 foreach (UUID itemID in m_PrimObjects[localID])
774 { 784 {
775 if (m_Scripts.ContainsKey(itemID)) 785 if (m_Scripts.ContainsKey(itemID))
@@ -821,7 +831,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
821 foreach (string s in pathList) 831 foreach (string s in pathList)
822 { 832 {
823 string path = Path.Combine(Directory.GetCurrentDirectory(), 833 string path = Path.Combine(Directory.GetCurrentDirectory(),
824 Path.Combine(s, assemblyName)) + ".dll"; 834 Path.Combine(s, assemblyName))+".dll";
825 835
826 if (File.Exists(path)) 836 if (File.Exists(path))
827 return Assembly.LoadFrom(path); 837 return Assembly.LoadFrom(path);
@@ -959,7 +969,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
959 i.Running = prevRunning; 969 i.Running = prevRunning;
960 } 970 }
961 971
962 DoBackup(new Object[] { 0 }); 972 DoBackup(new Object[] {0});
963 } 973 }
964 974
965 public IScriptApi GetApi(UUID itemID, string name) 975 public IScriptApi GetApi(UUID itemID, string name)