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.cs175
1 files changed, 158 insertions, 17 deletions
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index f025090..4c9ffd0 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -49,7 +49,7 @@ using OpenSim.Region.ScriptEngine.Interfaces;
49 49
50namespace OpenSim.Region.ScriptEngine.XEngine 50namespace OpenSim.Region.ScriptEngine.XEngine
51{ 51{
52 public class XEngine : IRegionModule, IScriptEngine 52 public class XEngine : IScriptModule, IScriptEngine
53 { 53 {
54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
55 55
@@ -64,6 +64,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
64 private int m_EventLimit; 64 private int m_EventLimit;
65 private bool m_KillTimedOutScripts; 65 private bool m_KillTimedOutScripts;
66 public AsyncCommandManager m_AsyncCommands; 66 public AsyncCommandManager m_AsyncCommands;
67 bool m_firstStart = true;
67 68
68 private static List<XEngine> m_ScriptEngines = 69 private static List<XEngine> m_ScriptEngines =
69 new List<XEngine>(); 70 new List<XEngine>();
@@ -93,6 +94,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
93 private Dictionary<LLUUID, List<LLUUID> > m_DomainScripts = 94 private Dictionary<LLUUID, List<LLUUID> > m_DomainScripts =
94 new Dictionary<LLUUID, List<LLUUID> >(); 95 new Dictionary<LLUUID, List<LLUUID> >();
95 96
97 private Queue m_CompileQueue = new Queue(100);
98 IWorkItemResult m_CurrentCompile = null;
99
96 public string ScriptEngineName 100 public string ScriptEngineName
97 { 101 {
98 get { return "XEngine"; } 102 get { return "XEngine"; }
@@ -202,6 +206,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
202 m_Scene.EventManager.OnRezScript += OnRezScript; 206 m_Scene.EventManager.OnRezScript += OnRezScript;
203 m_Scene.EventManager.OnRemoveScript += OnRemoveScript; 207 m_Scene.EventManager.OnRemoveScript += OnRemoveScript;
204 m_Scene.EventManager.OnScriptReset += OnScriptReset; 208 m_Scene.EventManager.OnScriptReset += OnScriptReset;
209 m_Scene.EventManager.OnStartScript += OnStartScript;
210 m_Scene.EventManager.OnStopScript += OnStopScript;
205 211
206 m_AsyncCommands = new AsyncCommandManager(this); 212 m_AsyncCommands = new AsyncCommandManager(this);
207 213
@@ -217,6 +223,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
217 m_ThreadPool.QueueWorkItem(new WorkItemCallback( 223 m_ThreadPool.QueueWorkItem(new WorkItemCallback(
218 this.DoBackup), new Object[] { saveTime }); 224 this.DoBackup), new Object[] { saveTime });
219 } 225 }
226
227 scene.RegisterModuleInterface<IScriptModule>(this);
220 } 228 }
221 229
222 public void PostInitialise() 230 public void PostInitialise()
@@ -314,23 +322,90 @@ namespace OpenSim.Region.ScriptEngine.XEngine
314 get { return m_MaxScriptQueue; } 322 get { return m_MaxScriptQueue; }
315 } 323 }
316 324
317 // 325 public void OnRezScript(uint localID, LLUUID itemID, string script, int startParam, bool postOnRez)
318 // Hooks
319 //
320 public void OnRezScript(uint localID, LLUUID itemID, string script)
321 { 326 {
322// m_ThreadPool.QueueWorkItem(new WorkItemCallback( 327 Object[] parms = new Object[]
323// this.DoOnRezScript), new Object[] 328 { localID, itemID, script, startParam, postOnRez};
324// { localID, itemID, script}); 329
325 DoOnRezScript(new Object[] { localID, itemID, script}); 330 lock(m_CompileQueue)
331 {
332 m_CompileQueue.Enqueue(parms);
333 if(m_CurrentCompile == null)
334 {
335 if(m_firstStart)
336 {
337 m_firstStart = false;
338 m_CurrentCompile = m_ThreadPool.QueueWorkItem(
339 new WorkItemCallback(
340 this.DoScriptWait), new Object[0]);
341 return;
342 }
343 m_CurrentCompile = m_ThreadPool.QueueWorkItem(
344 new WorkItemCallback(
345 this.DoOnRezScriptQueue), new Object[0]);
346 }
347 }
326 } 348 }
327 349
328 private object DoOnRezScript(object parm) 350 public Object DoScriptWait(Object dummy)
351 {
352 Thread.Sleep(30000);
353
354 lock(m_CompileQueue)
355 {
356 if(m_CompileQueue.Count > 0)
357 {
358 m_CurrentCompile = m_ThreadPool.QueueWorkItem(
359 new WorkItemCallback(
360 this.DoOnRezScriptQueue), new Object[0]);
361 }
362 else
363 {
364 m_CurrentCompile = null;
365 }
366 }
367 return null;
368 }
369
370 public Object DoOnRezScriptQueue(Object dummy)
371 {
372 Object o;
373 lock(m_CompileQueue)
374 {
375 o = m_CompileQueue.Dequeue();
376 if(o == null)
377 {
378 m_CurrentCompile = null;
379 return null;
380 }
381 }
382
383 DoOnRezScript(o);
384
385 lock(m_CompileQueue)
386 {
387 if(m_CompileQueue.Count > 0)
388 {
389 m_CurrentCompile = m_ThreadPool.QueueWorkItem(
390 new WorkItemCallback(
391 this.DoOnRezScriptQueue), new Object[0]);
392 }
393 else
394 {
395 m_CurrentCompile = null;
396 }
397 }
398 return null;
399 }
400
401 private bool DoOnRezScript(object parm)
329 { 402 {
330 Object[] p = (Object[])parm; 403 Object[] p = (Object[])parm;
331 uint localID = (uint)p[0]; 404 uint localID = (uint)p[0];
332 LLUUID itemID = (LLUUID)p[1]; 405 LLUUID itemID = (LLUUID)p[1];
333 string script =(string)p[2]; 406 string script =(string)p[2];
407 int startParam = (int)p[3];
408 bool postOnRez = (bool)p[4];
334 409
335 // Get the asset ID of the script, so we can check if we 410 // Get the asset ID of the script, so we can check if we
336 // already have it. 411 // already have it.
@@ -427,7 +502,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
427 part.UUID, itemID, assetID, assembly, 502 part.UUID, itemID, assetID, assembly,
428 m_AppDomains[appDomain], 503 m_AppDomains[appDomain],
429 part.ParentGroup.RootPart.Name, 504 part.ParentGroup.RootPart.Name,
430 item.Name, XScriptInstance.StateSource.NewRez); 505 item.Name, startParam, postOnRez,
506 XScriptInstance.StateSource.NewRez);
431 507
432 m_log.DebugFormat("[XEngine] Loaded script {0}.{1}", 508 m_log.DebugFormat("[XEngine] Loaded script {0}.{1}",
433 part.ParentGroup.RootPart.Name, item.Name); 509 part.ParentGroup.RootPart.Name, item.Name);
@@ -505,6 +581,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine
505 ResetScript(itemID); 581 ResetScript(itemID);
506 } 582 }
507 583
584 public void OnStartScript(uint localID, LLUUID itemID)
585 {
586 StartScript(itemID);
587 }
588
589 public void OnStopScript(uint localID, LLUUID itemID)
590 {
591 StopScript(itemID);
592 }
593
508 private void CleanAssemblies() 594 private void CleanAssemblies()
509 { 595 {
510 List<LLUUID> assetIDList = new List<LLUUID>(m_Assemblies.Keys); 596 List<LLUUID> assetIDList = new List<LLUUID>(m_Assemblies.Keys);
@@ -674,7 +760,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
674 if (running) 760 if (running)
675 instance.Start(); 761 instance.Start();
676 else 762 else
677 instance.Stop(500); 763 instance.Stop(100);
678 } 764 }
679 } 765 }
680 766
@@ -693,6 +779,20 @@ namespace OpenSim.Region.ScriptEngine.XEngine
693 instance.ResetScript(); 779 instance.ResetScript();
694 } 780 }
695 781
782 public void StartScript(LLUUID itemID)
783 {
784 XScriptInstance instance = GetInstance(itemID);
785 if (instance != null)
786 instance.Start();
787 }
788
789 public void StopScript(LLUUID itemID)
790 {
791 XScriptInstance instance = GetInstance(itemID);
792 if (instance != null)
793 instance.Stop(0);
794 }
795
696 public DetectParams GetDetectParams(LLUUID itemID, int idx) 796 public DetectParams GetDetectParams(LLUUID itemID, int idx)
697 { 797 {
698 XScriptInstance instance = GetInstance(itemID); 798 XScriptInstance instance = GetInstance(itemID);
@@ -723,6 +823,19 @@ namespace OpenSim.Region.ScriptEngine.XEngine
723 return "default"; 823 return "default";
724 return instance.State; 824 return instance.State;
725 } 825 }
826
827 public int GetStartParameter(LLUUID itemID)
828 {
829 XScriptInstance instance = GetInstance(itemID);
830 if (instance == null)
831 return 0;
832 return instance.StartParam;
833 }
834
835 public bool GetScriptRunning(LLUUID objectID, LLUUID itemID)
836 {
837 return GetScriptState(itemID);
838 }
726 } 839 }
727 840
728 public class XScriptInstance 841 public class XScriptInstance
@@ -745,6 +858,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
745 private string m_PrimName; 858 private string m_PrimName;
746 private string m_ScriptName; 859 private string m_ScriptName;
747 private string m_Assembly; 860 private string m_Assembly;
861 private int m_StartParam = 0;
862
748 private Dictionary<string,IScriptApi> m_Apis = new Dictionary<string,IScriptApi>(); 863 private Dictionary<string,IScriptApi> m_Apis = new Dictionary<string,IScriptApi>();
749 864
750 public enum StateSource 865 public enum StateSource
@@ -823,9 +938,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine
823 m_EventQueue.Clear(); 938 m_EventQueue.Clear();
824 } 939 }
825 940
941 public int StartParam
942 {
943 get { return m_StartParam; }
944 set { m_StartParam = value; }
945 }
946
826 public XScriptInstance(XEngine engine, uint localID, LLUUID objectID, 947 public XScriptInstance(XEngine engine, uint localID, LLUUID objectID,
827 LLUUID itemID, LLUUID assetID, string assembly, AppDomain dom, 948 LLUUID itemID, LLUUID assetID, string assembly, AppDomain dom,
828 string primName, string scriptName, StateSource stateSource) 949 string primName, string scriptName, int startParam,
950 bool postOnRez, StateSource stateSource)
829 { 951 {
830 m_Engine = engine; 952 m_Engine = engine;
831 953
@@ -836,6 +958,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
836 m_PrimName = primName; 958 m_PrimName = primName;
837 m_ScriptName = scriptName; 959 m_ScriptName = scriptName;
838 m_Assembly = assembly; 960 m_Assembly = assembly;
961 m_StartParam = startParam;
839 962
840 ApiManager am = new ApiManager(); 963 ApiManager am = new ApiManager();
841 964
@@ -918,6 +1041,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
918 { 1041 {
919 m_RunEvents = false; 1042 m_RunEvents = false;
920 Start(); 1043 Start();
1044 if(postOnRez)
1045 PostEvent(new EventParams("on_rez",
1046 new Object[] {new LSL_Types.LSLInteger(startParam)}, new DetectParams[0]));
921 } 1047 }
922 1048
923 // we get new rez events on sim restart, too 1049 // we get new rez events on sim restart, too
@@ -934,25 +1060,36 @@ namespace OpenSim.Region.ScriptEngine.XEngine
934 else 1060 else
935 { 1061 {
936 m_Engine.Log.Error("[XEngine] Unable to load script state: Memory limit exceeded"); 1062 m_Engine.Log.Error("[XEngine] Unable to load script state: Memory limit exceeded");
1063 Start();
937 PostEvent(new EventParams("state_entry", 1064 PostEvent(new EventParams("state_entry",
938 new Object[0], new DetectParams[0])); 1065 new Object[0], new DetectParams[0]));
939 Start(); 1066 if(postOnRez)
1067 PostEvent(new EventParams("on_rez",
1068 new Object[] {new LSL_Types.LSLInteger(startParam)}, new DetectParams[0]));
1069
940 } 1070 }
941 } 1071 }
942 catch (Exception e) 1072 catch (Exception e)
943 { 1073 {
944 m_Engine.Log.ErrorFormat("[XEngine] Unable to load script state from xml: {0}\n"+e.ToString(), xml); 1074 m_Engine.Log.ErrorFormat("[XEngine] Unable to load script state from xml: {0}\n"+e.ToString(), xml);
1075 Start();
945 PostEvent(new EventParams("state_entry", 1076 PostEvent(new EventParams("state_entry",
946 new Object[0], new DetectParams[0])); 1077 new Object[0], new DetectParams[0]));
947 Start(); 1078 if(postOnRez)
1079 PostEvent(new EventParams("on_rez",
1080 new Object[] {new LSL_Types.LSLInteger(startParam)}, new DetectParams[0]));
948 } 1081 }
949 } 1082 }
950 else 1083 else
951 { 1084 {
952 m_Engine.Log.ErrorFormat("[XEngine] Unable to load script state, file not found"); 1085// m_Engine.Log.ErrorFormat("[XEngine] Unable to load script state, file not found");
1086 Start();
953 PostEvent(new EventParams("state_entry", 1087 PostEvent(new EventParams("state_entry",
954 new Object[0], new DetectParams[0])); 1088 new Object[0], new DetectParams[0]));
955 Start(); 1089
1090 if(postOnRez)
1091 PostEvent(new EventParams("on_rez",
1092 new Object[] {new LSL_Types.LSLInteger(startParam)}, new DetectParams[0]));
956 } 1093 }
957 } 1094 }
958 1095
@@ -1062,6 +1199,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1062 { 1199 {
1063// m_Engine.Log.DebugFormat("[XEngine] Posted event {2} in state {3} to {0}.{1}", 1200// m_Engine.Log.DebugFormat("[XEngine] Posted event {2} in state {3} to {0}.{1}",
1064// m_PrimName, m_ScriptName, data.EventName, m_State); 1201// m_PrimName, m_ScriptName, data.EventName, m_State);
1202
1203 if(!Running)
1204 return;
1205
1065 lock (m_EventQueue) 1206 lock (m_EventQueue)
1066 { 1207 {
1067 if (m_EventQueue.Count >= m_Engine.MaxScriptQueue) 1208 if (m_EventQueue.Count >= m_Engine.MaxScriptQueue)