aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/XEngine
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/XEngine')
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs102
1 files changed, 46 insertions, 56 deletions
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 3431309..61b16f4 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,27 +537,17 @@ 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 AppDomain sandbox = 547 m_AppDomains[appDomain] =
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;
561 551
562 m_AppDomains[appDomain].AssemblyResolve += 552 m_AppDomains[appDomain].AssemblyResolve +=
563 new ResolveEventHandler( 553 new ResolveEventHandler(
@@ -613,7 +603,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
613 if (!m_Scripts.ContainsKey(itemID)) 603 if (!m_Scripts.ContainsKey(itemID))
614 return; 604 return;
615 605
616 IScriptInstance instance=m_Scripts[itemID]; 606 IScriptInstance instance = m_Scripts[itemID];
617 m_Scripts.Remove(itemID); 607 m_Scripts.Remove(itemID);
618 608
619 instance.ClearQueue(); 609 instance.ClearQueue();
@@ -685,17 +675,17 @@ namespace OpenSim.Region.ScriptEngine.XEngine
685 675
686 foreach (UUID assetID in assetIDList) 676 foreach (UUID assetID in assetIDList)
687 { 677 {
688// m_log.DebugFormat("[XEngine] Removing unreferenced assembly {0}", m_Assemblies[assetID]); 678 // m_log.DebugFormat("[XEngine] Removing unreferenced assembly {0}", m_Assemblies[assetID]);
689 try 679 try
690 { 680 {
691 if (File.Exists(m_Assemblies[assetID])) 681 if (File.Exists(m_Assemblies[assetID]))
692 File.Delete(m_Assemblies[assetID]); 682 File.Delete(m_Assemblies[assetID]);
693 683
694 if (File.Exists(m_Assemblies[assetID]+".state")) 684 if (File.Exists(m_Assemblies[assetID] + ".state"))
695 File.Delete(m_Assemblies[assetID]+".state"); 685 File.Delete(m_Assemblies[assetID] + ".state");
696 686
697 if (File.Exists(m_Assemblies[assetID]+".mdb")) 687 if (File.Exists(m_Assemblies[assetID] + ".mdb"))
698 File.Delete(m_Assemblies[assetID]+".mdb"); 688 File.Delete(m_Assemblies[assetID] + ".mdb");
699 } 689 }
700 catch (Exception) 690 catch (Exception)
701 { 691 {
@@ -713,7 +703,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
713 703
714 AppDomain.Unload(domain); 704 AppDomain.Unload(domain);
715 domain = null; 705 domain = null;
716// m_log.DebugFormat("[XEngine] Unloaded app domain {0}", id.ToString()); 706 // m_log.DebugFormat("[XEngine] Unloaded app domain {0}", id.ToString());
717 } 707 }
718 } 708 }
719 709
@@ -745,8 +735,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
745 return new XWorkItem(m_ThreadPool.QueueWorkItem( 735 return new XWorkItem(m_ThreadPool.QueueWorkItem(
746 new WorkItemCallback(this.ProcessEventHandler), 736 new WorkItemCallback(this.ProcessEventHandler),
747 parms)); 737 parms));
748 } 738 }
749 739
750 /// <summary> 740 /// <summary>
751 /// Process a previously posted script event. 741 /// Process a previously posted script event.
752 /// </summary> 742 /// </summary>
@@ -757,8 +747,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
757 CultureInfo USCulture = new CultureInfo("en-US"); 747 CultureInfo USCulture = new CultureInfo("en-US");
758 Thread.CurrentThread.CurrentCulture = USCulture; 748 Thread.CurrentThread.CurrentCulture = USCulture;
759 749
760 IScriptInstance instance = (ScriptInstance) parms; 750 IScriptInstance instance = (ScriptInstance)parms;
761 751
762 //m_log.DebugFormat("[XENGINE]: Processing event for {0}", instance); 752 //m_log.DebugFormat("[XENGINE]: Processing event for {0}", instance);
763 753
764 return instance.EventProcessor(); 754 return instance.EventProcessor();
@@ -773,13 +763,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine
773 public bool PostObjectEvent(uint localID, EventParams p) 763 public bool PostObjectEvent(uint localID, EventParams p)
774 { 764 {
775 bool result = false; 765 bool result = false;
776 766
777 lock (m_PrimObjects) 767 lock (m_PrimObjects)
778 { 768 {
779 if (!m_PrimObjects.ContainsKey(localID)) 769 if (!m_PrimObjects.ContainsKey(localID))
780 return false; 770 return false;
781 771
782 772
783 foreach (UUID itemID in m_PrimObjects[localID]) 773 foreach (UUID itemID in m_PrimObjects[localID])
784 { 774 {
785 if (m_Scripts.ContainsKey(itemID)) 775 if (m_Scripts.ContainsKey(itemID))
@@ -831,7 +821,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
831 foreach (string s in pathList) 821 foreach (string s in pathList)
832 { 822 {
833 string path = Path.Combine(Directory.GetCurrentDirectory(), 823 string path = Path.Combine(Directory.GetCurrentDirectory(),
834 Path.Combine(s, assemblyName))+".dll"; 824 Path.Combine(s, assemblyName)) + ".dll";
835 825
836 if (File.Exists(path)) 826 if (File.Exists(path))
837 return Assembly.LoadFrom(path); 827 return Assembly.LoadFrom(path);
@@ -969,7 +959,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
969 i.Running = prevRunning; 959 i.Running = prevRunning;
970 } 960 }
971 961
972 DoBackup(new Object[] {0}); 962 DoBackup(new Object[] { 0 });
973 } 963 }
974 964
975 public IScriptApi GetApi(UUID itemID, string name) 965 public IScriptApi GetApi(UUID itemID, string name)