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.cs148
1 files changed, 77 insertions, 71 deletions
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index a4113d6..906c6ee 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -70,7 +70,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
70 /// <remarks> 70 /// <remarks>
71 /// If DebugLevel >= 1, then we log every time that a script is started. 71 /// If DebugLevel >= 1, then we log every time that a script is started.
72 /// </remarks> 72 /// </remarks>
73// public int DebugLevel { get; set; } 73 public int DebugLevel { get; set; }
74 74
75 private SmartThreadPool m_ThreadPool; 75 private SmartThreadPool m_ThreadPool;
76 private int m_MaxScriptQueue; 76 private int m_MaxScriptQueue;
@@ -101,7 +101,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
101 private bool m_InitialStartup = true; 101 private bool m_InitialStartup = true;
102 private int m_ScriptFailCount; // Number of script fails since compile queue was last empty 102 private int m_ScriptFailCount; // Number of script fails since compile queue was last empty
103 private string m_ScriptErrorMessage; 103 private string m_ScriptErrorMessage;
104 private Dictionary<string, string> m_uniqueScripts = new Dictionary<string, string>();
105 private bool m_AppDomainLoading; 104 private bool m_AppDomainLoading;
106 private Dictionary<UUID,ArrayList> m_ScriptErrors = 105 private Dictionary<UUID,ArrayList> m_ScriptErrors =
107 new Dictionary<UUID,ArrayList>(); 106 new Dictionary<UUID,ArrayList>();
@@ -403,12 +402,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
403 + "Level >= 2, log event invocations.\n", 402 + "Level >= 2, log event invocations.\n",
404 HandleDebugScriptLogCommand); 403 HandleDebugScriptLogCommand);
405 404
406// MainConsole.Instance.Commands.AddCommand( 405 MainConsole.Instance.Commands.AddCommand(
407// "Debug", false, "debug xengine", "debug xengine [<level>]", 406 "Debug", false, "debug xengine log", "debug xengine log [<level>]",
408// "Turn on detailed xengine debugging.", 407 "Turn on detailed xengine debugging.",
409// "If level <= 0, then no extra logging is done.\n" 408 "If level <= 0, then no extra logging is done.\n"
410// + "If level >= 1, then we log every time that a script is started.", 409 + "If level >= 1, then we log every time that a script is started.",
411// HandleDebugLevelCommand); 410 HandleDebugLevelCommand);
412 } 411 }
413 412
414 private void HandleDebugScriptLogCommand(string module, string[] args) 413 private void HandleDebugScriptLogCommand(string module, string[] args)
@@ -451,26 +450,26 @@ namespace OpenSim.Region.ScriptEngine.XEngine
451 /// </summary> 450 /// </summary>
452 /// <param name="module"></param> 451 /// <param name="module"></param>
453 /// <param name="args"></param> 452 /// <param name="args"></param>
454// private void HandleDebugLevelCommand(string module, string[] args) 453 private void HandleDebugLevelCommand(string module, string[] args)
455// { 454 {
456// if (args.Length == 3) 455 if (args.Length <= 4)
457// { 456 {
458// int newDebug; 457 int newDebug;
459// if (int.TryParse(args[2], out newDebug)) 458 if (ConsoleUtil.TryParseConsoleNaturalInt(MainConsole.Instance, args[3], out newDebug))
460// { 459 {
461// DebugLevel = newDebug; 460 DebugLevel = newDebug;
462// MainConsole.Instance.OutputFormat("Debug level set to {0}", newDebug); 461 MainConsole.Instance.OutputFormat("Debug level set to {0} in XEngine for region {1}", newDebug, m_Scene.Name);
463// } 462 }
464// } 463 }
465// else if (args.Length == 2) 464 else if (args.Length == 3)
466// { 465 {
467// MainConsole.Instance.OutputFormat("Current debug level is {0}", DebugLevel); 466 MainConsole.Instance.OutputFormat("Current debug level is {0}", DebugLevel);
468// } 467 }
469// else 468 else
470// { 469 {
471// MainConsole.Instance.Output("Usage: debug xengine 0..1"); 470 MainConsole.Instance.Output("Usage: debug xengine log <level>");
472// } 471 }
473// } 472 }
474 473
475 /// <summary> 474 /// <summary>
476 /// Parse the raw item id into a script instance from the command params if it's present. 475 /// Parse the raw item id into a script instance from the command params if it's present.
@@ -570,7 +569,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
570 } 569 }
571 570
572 sb.AppendFormat("Scripts loaded : {0}\n", scriptsLoaded); 571 sb.AppendFormat("Scripts loaded : {0}\n", scriptsLoaded);
573 sb.AppendFormat("Unique scripts : {0}\n", m_uniqueScripts.Count);
574 sb.AppendFormat("Scripts waiting for load : {0}\n", m_CompileQueue.Count); 572 sb.AppendFormat("Scripts waiting for load : {0}\n", m_CompileQueue.Count);
575 sb.AppendFormat("Max threads : {0}\n", m_ThreadPool.MaxThreads); 573 sb.AppendFormat("Max threads : {0}\n", m_ThreadPool.MaxThreads);
576 sb.AppendFormat("Min threads : {0}\n", m_ThreadPool.MinThreads); 574 sb.AppendFormat("Min threads : {0}\n", m_ThreadPool.MinThreads);
@@ -716,22 +714,17 @@ namespace OpenSim.Region.ScriptEngine.XEngine
716 { 714 {
717 // Force a final state save 715 // Force a final state save
718 // 716 //
719 if (m_Assemblies.ContainsKey(instance.AssetID)) 717 try
720 { 718 {
721 string assembly = m_Assemblies[instance.AssetID]; 719 instance.SaveState();
722 720 }
723 try 721 catch (Exception e)
724 { 722 {
725 instance.SaveState(assembly); 723 m_log.Error(
726 } 724 string.Format(
727 catch (Exception e) 725 "[XEngine]: Failed final state save for script {0}.{1}, item UUID {2}, prim UUID {3} in {4}. Exception ",
728 { 726 instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, World.Name)
729 m_log.Error( 727 , 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 } 728 }
736 729
737 // Clear the event queue and abort the instance thread 730 // Clear the event queue and abort the instance thread
@@ -840,18 +833,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
840 833
841 foreach (IScriptInstance i in instances) 834 foreach (IScriptInstance i in instances)
842 { 835 {
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 836 try
853 { 837 {
854 i.SaveState(assembly); 838 i.SaveState();
855 } 839 }
856 catch (Exception e) 840 catch (Exception e)
857 { 841 {
@@ -1001,12 +985,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1001 if (engine != ScriptEngineName) 985 if (engine != ScriptEngineName)
1002 return; 986 return;
1003 987
1004 // If we've seen this exact script text before, use that reference instead
1005 if (m_uniqueScripts.ContainsKey(script))
1006 script = m_uniqueScripts[script];
1007 else
1008 m_uniqueScripts[script] = script;
1009
1010 Object[] parms = new Object[]{localID, itemID, script, startParam, postOnRez, (StateSource)stateSource}; 988 Object[] parms = new Object[]{localID, itemID, script, startParam, postOnRez, (StateSource)stateSource};
1011 989
1012 if (stateSource == (int)StateSource.ScriptedRez) 990 if (stateSource == (int)StateSource.ScriptedRez)
@@ -1020,11 +998,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1020 } 998 }
1021 else 999 else
1022 { 1000 {
1023 m_CompileQueue.Enqueue(parms);
1024 lock (m_CompileDict) 1001 lock (m_CompileDict)
1025 {
1026 m_CompileDict[itemID] = 0; 1002 m_CompileDict[itemID] = 0;
1027 } 1003
1004 // This must occur after the m_CompileDict so that an existing compile thread cannot hit the check
1005 // in DoOnRezScript() before m_CompileDict has been updated.
1006 m_CompileQueue.Enqueue(parms);
1028 1007
1029// m_log.DebugFormat("[XEngine]: Added script {0} to compile queue", itemID); 1008// m_log.DebugFormat("[XEngine]: Added script {0} to compile queue", itemID);
1030 1009
@@ -1100,7 +1079,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1100 // due to a race condition 1079 // due to a race condition
1101 // 1080 //
1102 lock (m_CompileQueue) 1081 lock (m_CompileQueue)
1082 {
1103 m_CurrentCompile = null; 1083 m_CurrentCompile = null;
1084
1085 // This is to avoid a situation where the m_CompileQueue while loop above could complete but
1086 // OnRezScript() place a new script on the queue and check m_CurrentCompile = null before we hit
1087 // this section.
1088 if (m_CompileQueue.Count > 0)
1089 m_CurrentCompile = m_ThreadPool.QueueWorkItem(DoOnRezScriptQueue, null);
1090 }
1104 } 1091 }
1105 1092
1106 return null; 1093 return null;
@@ -1148,10 +1135,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1148 return false; 1135 return false;
1149 } 1136 }
1150 1137
1151 m_log.DebugFormat( 1138 if (DebugLevel > 0)
1152 "[XEngine]: Loading script {0}.{1}, item UUID {2}, prim UUID {3} @ {4}.{5}", 1139 m_log.DebugFormat(
1153 part.ParentGroup.RootPart.Name, item.Name, itemID, part.UUID, 1140 "[XEngine]: Loading script {0}.{1}, item UUID {2}, prim UUID {3} @ {4}.{5}",
1154 part.ParentGroup.RootPart.AbsolutePosition, part.ParentGroup.Scene.RegionInfo.RegionName); 1141 part.ParentGroup.RootPart.Name, item.Name, itemID, part.UUID,
1142 part.ParentGroup.RootPart.AbsolutePosition, part.ParentGroup.Scene.RegionInfo.RegionName);
1155 1143
1156 UUID assetID = item.AssetID; 1144 UUID assetID = item.AssetID;
1157 1145
@@ -1170,7 +1158,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1170 lock (m_AddingAssemblies) 1158 lock (m_AddingAssemblies)
1171 { 1159 {
1172 m_Compiler.PerformScriptCompile(script, assetID.ToString(), item.OwnerID, out assemblyPath, out linemap); 1160 m_Compiler.PerformScriptCompile(script, assetID.ToString(), item.OwnerID, out assemblyPath, out linemap);
1173 1161
1162// m_log.DebugFormat(
1163// "[XENGINE]: Found assembly path {0} onrez {1} in {2}",
1164// assemblyPath, item.ItemID, World.Name);
1165
1174 if (!m_AddingAssemblies.ContainsKey(assemblyPath)) { 1166 if (!m_AddingAssemblies.ContainsKey(assemblyPath)) {
1175 m_AddingAssemblies[assemblyPath] = 1; 1167 m_AddingAssemblies[assemblyPath] = 1;
1176 } else { 1168 } else {
@@ -1348,14 +1340,24 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1348 // simulator session if the script halt strategy has been changed. Instead, we'll continue with 1340 // simulator session if the script halt strategy has been changed. Instead, we'll continue with
1349 // the existing DLL and the new one will be used in the next simulator session. 1341 // the existing DLL and the new one will be used in the next simulator session.
1350 if (recompile) 1342 if (recompile)
1343 {
1344 m_log.DebugFormat(
1345 "[XEngine]: Recompiling script {0}.{1}, item UUID {2}, prim UUID {3} @ {4}.{5} to switch it to {6} termination. Will be active on next restart.",
1346 part.ParentGroup.RootPart.Name, item.Name, itemID, part.UUID,
1347 part.ParentGroup.RootPart.AbsolutePosition, part.ParentGroup.Scene.Name,
1348 m_coopTermination ? "co-op" : "abort");
1349
1351 m_Compiler.PerformScriptCompile(script, assetID.ToString(), item.OwnerID, true, out assemblyPath, out linemap); 1350 m_Compiler.PerformScriptCompile(script, assetID.ToString(), item.OwnerID, true, out assemblyPath, out linemap);
1351 }
1352 1352
1353 instance = new ScriptInstance(this, part, 1353 instance = new ScriptInstance(this, part,
1354 item, 1354 item,
1355 startParam, postOnRez, 1355 startParam, postOnRez,
1356 m_MaxScriptQueue); 1356 m_MaxScriptQueue);
1357 1357
1358 if (!instance.Load(m_AppDomains[appDomain], scriptAssembly, stateSource)) 1358 if (!instance.Load(
1359 m_AppDomains[appDomain], scriptAssembly,
1360 Path.Combine(ScriptEnginePath, World.RegionInfo.RegionID.ToString()), stateSource))
1359 return false; 1361 return false;
1360 1362
1361// if (DebugLevel >= 1) 1363// if (DebugLevel >= 1)
@@ -1586,7 +1588,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1586 1588
1587 IScriptInstance instance = (ScriptInstance) parms; 1589 IScriptInstance instance = (ScriptInstance) parms;
1588 1590
1589 //m_log.DebugFormat("[XEngine]: Processing event for {0}", instance); 1591// m_log.DebugFormat("[XEngine]: Processing event for {0}", instance);
1590 1592
1591 return instance.EventProcessor(); 1593 return instance.EventProcessor();
1592 } 1594 }
@@ -2155,7 +2157,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
2155 catch (IOException ex) 2157 catch (IOException ex)
2156 { 2158 {
2157 // if there already exists a file at that location, it may be locked. 2159 // if there already exists a file at that location, it may be locked.
2158 m_log.ErrorFormat("[XEngine]: Linemap file {0} already exists! {1}", mappath, ex.Message); 2160 m_log.Error(
2161 string.Format("[XEngine]: Linemap file {0} could not be written. Exception ", mappath), ex);
2159 } 2162 }
2160 } 2163 }
2161 } 2164 }
@@ -2181,6 +2184,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
2181 m_log.ErrorFormat("[XEngine]: Error whilst writing state file {0}, {1}", statepath, ex.Message); 2184 m_log.ErrorFormat("[XEngine]: Error whilst writing state file {0}, {1}", statepath, ex.Message);
2182 } 2185 }
2183 2186
2187// m_log.DebugFormat(
2188// "[XEngine]: Wrote state for script item with ID {0} at {1} in {2}", itemID, statepath, m_Scene.Name);
2189
2184 return true; 2190 return true;
2185 } 2191 }
2186 2192