diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
11 files changed, 307 insertions, 6 deletions
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs index 8762642..b04f6b6 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs | |||
@@ -78,12 +78,38 @@ namespace OpenSim.Region.ScriptEngine.Interfaces | |||
78 | /// </summary> | 78 | /// </summary> |
79 | string State { get; set; } | 79 | string State { get; set; } |
80 | 80 | ||
81 | /// <summary> | ||
82 | /// Time the script was last started | ||
83 | /// </summary> | ||
84 | DateTime TimeStarted { get; } | ||
85 | |||
86 | /// <summary> | ||
87 | /// Tick the last measurement period was started. | ||
88 | /// </summary> | ||
89 | long MeasurementPeriodTickStart { get; } | ||
90 | |||
91 | /// <summary> | ||
92 | /// Ticks spent executing in the last measurement period. | ||
93 | /// </summary> | ||
94 | long MeasurementPeriodExecutionTime { get; } | ||
95 | |||
81 | IScriptEngine Engine { get; } | 96 | IScriptEngine Engine { get; } |
82 | UUID AppDomain { get; set; } | 97 | UUID AppDomain { get; set; } |
83 | string PrimName { get; } | 98 | string PrimName { get; } |
84 | string ScriptName { get; } | 99 | string ScriptName { get; } |
85 | UUID ItemID { get; } | 100 | UUID ItemID { get; } |
86 | UUID ObjectID { get; } | 101 | UUID ObjectID { get; } |
102 | |||
103 | /// <summary> | ||
104 | /// UUID of the root object for the linkset that the script is in. | ||
105 | /// </summary> | ||
106 | UUID RootObjectID { get; } | ||
107 | |||
108 | /// <summary> | ||
109 | /// Local id of the root object for the linkset that the script is in. | ||
110 | /// </summary> | ||
111 | uint RootLocalID { get; } | ||
112 | |||
87 | uint LocalID { get; } | 113 | uint LocalID { get; } |
88 | UUID AssetID { get; } | 114 | UUID AssetID { get; } |
89 | Queue EventQueue { get; } | 115 | Queue EventQueue { get; } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs index d4facdd..2942104 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs | |||
@@ -116,6 +116,115 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
116 | wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, message); | 116 | wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, message); |
117 | } | 117 | } |
118 | 118 | ||
119 | /// <summary> | ||
120 | /// | ||
121 | /// </summary> | ||
122 | /// <param name="fname">The name of the function to invoke</param> | ||
123 | /// <param name="fname">List of parameters</param> | ||
124 | /// <returns>string result of the invocation</returns> | ||
125 | public string modInvokeS(string fname, params object[] parms) | ||
126 | { | ||
127 | Type returntype = m_comms.LookupReturnType(fname); | ||
128 | if (returntype != typeof(string)) | ||
129 | MODError(String.Format("return type mismatch for {0}",fname)); | ||
130 | |||
131 | return (string)modInvoke(fname,parms); | ||
132 | } | ||
133 | |||
134 | public int modInvokeI(string fname, params object[] parms) | ||
135 | { | ||
136 | Type returntype = m_comms.LookupReturnType(fname); | ||
137 | if (returntype != typeof(int)) | ||
138 | MODError(String.Format("return type mismatch for {0}",fname)); | ||
139 | |||
140 | return (int)modInvoke(fname,parms); | ||
141 | } | ||
142 | |||
143 | public float modInvokeF(string fname, params object[] parms) | ||
144 | { | ||
145 | Type returntype = m_comms.LookupReturnType(fname); | ||
146 | if (returntype != typeof(float)) | ||
147 | MODError(String.Format("return type mismatch for {0}",fname)); | ||
148 | |||
149 | return (float)modInvoke(fname,parms); | ||
150 | } | ||
151 | |||
152 | /// <summary> | ||
153 | /// Invokes a preregistered function through the ScriptModuleComms class | ||
154 | /// </summary> | ||
155 | /// <param name="fname">The name of the function to invoke</param> | ||
156 | /// <param name="fname">List of parameters</param> | ||
157 | /// <returns>string result of the invocation</returns> | ||
158 | protected object modInvoke(string fname, params object[] parms) | ||
159 | { | ||
160 | if (!m_MODFunctionsEnabled) | ||
161 | { | ||
162 | MODShoutError("Module command functions not enabled"); | ||
163 | return ""; | ||
164 | } | ||
165 | |||
166 | Type[] signature = m_comms.LookupTypeSignature(fname); | ||
167 | if (signature.Length != parms.Length) | ||
168 | MODError(String.Format("wrong number of parameters to function {0}",fname)); | ||
169 | |||
170 | object[] convertedParms = new object[parms.Length]; | ||
171 | |||
172 | for (int i = 0; i < parms.Length; i++) | ||
173 | { | ||
174 | if (parms[i] is LSL_String) | ||
175 | { | ||
176 | if (signature[i] != typeof(string)) | ||
177 | MODError(String.Format("parameter type mismatch in {0}; expecting {1}",fname,signature[i].Name)); | ||
178 | |||
179 | convertedParms[i] = (string)(LSL_String)parms[i]; | ||
180 | } | ||
181 | else if (parms[i] is LSL_Integer) | ||
182 | { | ||
183 | if (signature[i] != typeof(int)) | ||
184 | MODError(String.Format("parameter type mismatch in {0}; expecting {1}",fname,signature[i].Name)); | ||
185 | |||
186 | convertedParms[i] = (int)(LSL_Integer)parms[i]; | ||
187 | } | ||
188 | else if (parms[i] is LSL_Float) | ||
189 | { | ||
190 | if (signature[i] != typeof(float)) | ||
191 | MODError(String.Format("parameter type mismatch in {0}; expecting {1}",fname,signature[i].Name)); | ||
192 | |||
193 | convertedParms[i] = (float)(LSL_Float)parms[i]; | ||
194 | } | ||
195 | else if (parms[i] is LSL_Key) | ||
196 | { | ||
197 | if (signature[i] != typeof(string)) | ||
198 | MODError(String.Format("parameter type mismatch in {0}; expecting {1}",fname,signature[i].Name)); | ||
199 | |||
200 | convertedParms[i] = (string)(LSL_Key)parms[i]; | ||
201 | } | ||
202 | else if (parms[i] is LSL_Rotation) | ||
203 | { | ||
204 | if (signature[i] != typeof(string)) | ||
205 | MODError(String.Format("parameter type mismatch in {0}; expecting {1}",fname,signature[i].Name)); | ||
206 | |||
207 | convertedParms[i] = (string)(LSL_Rotation)parms[i]; | ||
208 | } | ||
209 | else if (parms[i] is LSL_Vector) | ||
210 | { | ||
211 | if (signature[i] != typeof(string)) | ||
212 | MODError(String.Format("parameter type mismatch in {0}; expecting {1}",fname,signature[i].Name)); | ||
213 | |||
214 | convertedParms[i] = (string)(LSL_Vector)parms[i]; | ||
215 | } | ||
216 | else | ||
217 | { | ||
218 | if (signature[i] != parms[i].GetType()) | ||
219 | MODError(String.Format("parameter type mismatch in {0}; expecting {1}",fname,signature[i].Name)); | ||
220 | |||
221 | convertedParms[i] = parms[i]; | ||
222 | } | ||
223 | } | ||
224 | |||
225 | return m_comms.InvokeOperation(m_itemID,fname,convertedParms); | ||
226 | } | ||
227 | |||
119 | public string modSendCommand(string module, string command, string k) | 228 | public string modSendCommand(string module, string command, string k) |
120 | { | 229 | { |
121 | if (!m_MODFunctionsEnabled) | 230 | if (!m_MODFunctionsEnabled) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 8dfc7d2..d140c26 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -3003,5 +3003,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3003 | 3003 | ||
3004 | return date.ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"); | 3004 | return date.ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"); |
3005 | } | 3005 | } |
3006 | |||
3007 | /// <summary> | ||
3008 | /// Get the description from an inventory item | ||
3009 | /// </summary> | ||
3010 | /// <param name="inventoryName"></param> | ||
3011 | /// <returns>Item description</returns> | ||
3012 | public LSL_String osGetInventoryDesc(string item) | ||
3013 | { | ||
3014 | m_host.AddScriptLPS(1); | ||
3015 | |||
3016 | lock (m_host.TaskInventory) | ||
3017 | { | ||
3018 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
3019 | { | ||
3020 | if (inv.Value.Name == item) | ||
3021 | { | ||
3022 | return inv.Value.Description.ToString(); | ||
3023 | } | ||
3024 | } | ||
3025 | } | ||
3026 | |||
3027 | return String.Empty; | ||
3028 | } | ||
3006 | } | 3029 | } |
3007 | } | 3030 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IMOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IMOD_Api.cs index e08eca5..756a59f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IMOD_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IMOD_Api.cs | |||
@@ -40,6 +40,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
40 | { | 40 | { |
41 | public interface IMOD_Api | 41 | public interface IMOD_Api |
42 | { | 42 | { |
43 | // Invocation functions | ||
44 | string modInvokeS(string fname, params object[] parms); | ||
45 | int modInvokeI(string fname, params object[] parms); | ||
46 | float modInvokeF(string fname, params object[] parms); | ||
47 | // vector modInvokeV(string fname, params object[] parms); | ||
48 | // rotation modInvokeV(string fname, params object[] parms); | ||
49 | // key modInvokeK(string fname, params object[] parms); | ||
50 | // list modInvokeL(string fname, params object[] parms); | ||
51 | |||
43 | //Module functions | 52 | //Module functions |
44 | string modSendCommand(string modules, string command, string k); | 53 | string modSendCommand(string modules, string command, string k); |
45 | } | 54 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index e59d3a8..1f4c4b1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | |||
@@ -229,5 +229,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
229 | LSL_List osGetAvatarList(); | 229 | LSL_List osGetAvatarList(); |
230 | 230 | ||
231 | LSL_String osUnixTimeToTimestamp(long time); | 231 | LSL_String osUnixTimeToTimestamp(long time); |
232 | |||
233 | LSL_String osGetInventoryDesc(string item); | ||
232 | } | 234 | } |
233 | } | 235 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/MOD_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/MOD_Stub.cs index 6525c76..04b7f14 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/MOD_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/MOD_Stub.cs | |||
@@ -58,6 +58,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
58 | m_MOD_Functions = (IMOD_Api)api; | 58 | m_MOD_Functions = (IMOD_Api)api; |
59 | } | 59 | } |
60 | 60 | ||
61 | public string modInvokeS(string fname, params object[] parms) | ||
62 | { | ||
63 | return m_MOD_Functions.modInvokeS(fname, parms); | ||
64 | } | ||
65 | |||
66 | public int modInvokeI(string fname, params object[] parms) | ||
67 | { | ||
68 | return m_MOD_Functions.modInvokeI(fname, parms); | ||
69 | } | ||
70 | |||
71 | public float modInvokeF(string fname, params object[] parms) | ||
72 | { | ||
73 | return m_MOD_Functions.modInvokeF(fname, parms); | ||
74 | } | ||
75 | |||
61 | public string modSendCommand(string module, string command, string k) | 76 | public string modSendCommand(string module, string command, string k) |
62 | { | 77 | { |
63 | return m_MOD_Functions.modSendCommand(module, command, k); | 78 | return m_MOD_Functions.modSendCommand(module, command, k); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index e048da2..09e5992 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | |||
@@ -863,5 +863,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
863 | { | 863 | { |
864 | return m_OSSL_Functions.osUnixTimeToTimestamp(time); | 864 | return m_OSSL_Functions.osUnixTimeToTimestamp(time); |
865 | } | 865 | } |
866 | |||
867 | public LSL_String osGetInventoryDesc(string item) | ||
868 | { | ||
869 | return m_OSSL_Functions.osGetInventoryDesc(item); | ||
870 | } | ||
866 | } | 871 | } |
867 | } | 872 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs index 65d3b9b..b24f016 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs | |||
@@ -32,6 +32,8 @@ using System.Reflection; | |||
32 | using log4net; | 32 | using log4net; |
33 | using Tools; | 33 | using Tools; |
34 | 34 | ||
35 | using OpenSim.Region.Framework.Interfaces; | ||
36 | |||
35 | namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | 37 | namespace OpenSim.Region.ScriptEngine.Shared.CodeTools |
36 | { | 38 | { |
37 | public class CSCodeGenerator : ICodeConverter | 39 | public class CSCodeGenerator : ICodeConverter |
@@ -45,12 +47,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
45 | private int m_CSharpLine; // the current line of generated C# code | 47 | private int m_CSharpLine; // the current line of generated C# code |
46 | private int m_CSharpCol; // the current column of generated C# code | 48 | private int m_CSharpCol; // the current column of generated C# code |
47 | private List<string> m_warnings = new List<string>(); | 49 | private List<string> m_warnings = new List<string>(); |
50 | private IScriptModuleComms m_comms = null; | ||
48 | 51 | ||
49 | /// <summary> | 52 | /// <summary> |
50 | /// Creates an 'empty' CSCodeGenerator instance. | 53 | /// Creates an 'empty' CSCodeGenerator instance. |
51 | /// </summary> | 54 | /// </summary> |
52 | public CSCodeGenerator() | 55 | public CSCodeGenerator() |
53 | { | 56 | { |
57 | m_comms = null; | ||
58 | ResetCounters(); | ||
59 | } | ||
60 | |||
61 | public CSCodeGenerator(IScriptModuleComms comms) | ||
62 | { | ||
63 | m_comms = comms; | ||
54 | ResetCounters(); | 64 | ResetCounters(); |
55 | } | 65 | } |
56 | 66 | ||
@@ -866,8 +876,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
866 | { | 876 | { |
867 | string retstr = String.Empty; | 877 | string retstr = String.Empty; |
868 | 878 | ||
869 | retstr += Generate(String.Format("{0}(", CheckName(fc.Id)), fc); | 879 | string modinvoke = null; |
870 | 880 | if (m_comms != null) | |
881 | modinvoke = m_comms.LookupModInvocation(fc.Id); | ||
882 | |||
883 | if (modinvoke != null) | ||
884 | { | ||
885 | if (fc.kids[0] is ArgumentList) | ||
886 | { | ||
887 | if ((fc.kids[0] as ArgumentList).kids.Count == 0) | ||
888 | retstr += Generate(String.Format("{0}(\"{1}\"",modinvoke,fc.Id), fc); | ||
889 | else | ||
890 | retstr += Generate(String.Format("{0}(\"{1}\",",modinvoke,fc.Id), fc); | ||
891 | } | ||
892 | } | ||
893 | else | ||
894 | { | ||
895 | retstr += Generate(String.Format("{0}(", CheckName(fc.Id)), fc); | ||
896 | } | ||
897 | |||
871 | foreach (SYMBOL kid in fc.kids) | 898 | foreach (SYMBOL kid in fc.kids) |
872 | retstr += GenerateNode(kid); | 899 | retstr += GenerateNode(kid); |
873 | 900 | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs index c10143b..8f2ec49 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs | |||
@@ -35,6 +35,7 @@ using Microsoft.CSharp; | |||
35 | //using Microsoft.JScript; | 35 | //using Microsoft.JScript; |
36 | using Microsoft.VisualBasic; | 36 | using Microsoft.VisualBasic; |
37 | using log4net; | 37 | using log4net; |
38 | |||
38 | using OpenSim.Region.Framework.Interfaces; | 39 | using OpenSim.Region.Framework.Interfaces; |
39 | using OpenSim.Region.ScriptEngine.Interfaces; | 40 | using OpenSim.Region.ScriptEngine.Interfaces; |
40 | using OpenMetaverse; | 41 | using OpenMetaverse; |
@@ -293,6 +294,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
293 | { | 294 | { |
294 | // m_log.DebugFormat("[Compiler]: Compiling script\n{0}", Script); | 295 | // m_log.DebugFormat("[Compiler]: Compiling script\n{0}", Script); |
295 | 296 | ||
297 | IScriptModuleComms comms = m_scriptEngine.World.RequestModuleInterface<IScriptModuleComms>(); | ||
298 | |||
296 | linemap = null; | 299 | linemap = null; |
297 | m_warnings.Clear(); | 300 | m_warnings.Clear(); |
298 | 301 | ||
@@ -382,7 +385,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
382 | if (language == enumCompileType.lsl) | 385 | if (language == enumCompileType.lsl) |
383 | { | 386 | { |
384 | // Its LSL, convert it to C# | 387 | // Its LSL, convert it to C# |
385 | LSL_Converter = (ICodeConverter)new CSCodeGenerator(); | 388 | LSL_Converter = (ICodeConverter)new CSCodeGenerator(comms); |
386 | compileScript = LSL_Converter.Convert(Script); | 389 | compileScript = LSL_Converter.Convert(Script); |
387 | 390 | ||
388 | // copy converter warnings into our warnings. | 391 | // copy converter warnings into our warnings. |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index f40da01..ff1f277 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -165,6 +165,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
165 | 165 | ||
166 | public uint LocalID { get; private set; } | 166 | public uint LocalID { get; private set; } |
167 | 167 | ||
168 | public UUID RootObjectID { get; private set; } | ||
169 | |||
170 | public uint RootLocalID { get; private set; } | ||
171 | |||
168 | public UUID AssetID { get; private set; } | 172 | public UUID AssetID { get; private set; } |
169 | 173 | ||
170 | public Queue EventQueue { get; private set; } | 174 | public Queue EventQueue { get; private set; } |
@@ -173,6 +177,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
173 | 177 | ||
174 | public TaskInventoryItem ScriptTask { get; private set; } | 178 | public TaskInventoryItem ScriptTask { get; private set; } |
175 | 179 | ||
180 | public DateTime TimeStarted { get; private set; } | ||
181 | |||
182 | public long MeasurementPeriodTickStart { get; private set; } | ||
183 | |||
184 | public long MeasurementPeriodExecutionTime { get; private set; } | ||
185 | |||
186 | public static readonly long MaxMeasurementPeriod = 30 * TimeSpan.TicksPerMinute; | ||
187 | |||
176 | public void ClearQueue() | 188 | public void ClearQueue() |
177 | { | 189 | { |
178 | m_TimerQueued = false; | 190 | m_TimerQueued = false; |
@@ -191,6 +203,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
191 | Engine = engine; | 203 | Engine = engine; |
192 | LocalID = part.LocalId; | 204 | LocalID = part.LocalId; |
193 | ObjectID = part.UUID; | 205 | ObjectID = part.UUID; |
206 | RootLocalID = part.ParentGroup.LocalId; | ||
207 | RootObjectID = part.ParentGroup.UUID; | ||
194 | ItemID = itemID; | 208 | ItemID = itemID; |
195 | AssetID = assetID; | 209 | AssetID = assetID; |
196 | PrimName = primName; | 210 | PrimName = primName; |
@@ -459,6 +473,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
459 | 473 | ||
460 | Running = true; | 474 | Running = true; |
461 | 475 | ||
476 | TimeStarted = DateTime.Now; | ||
477 | MeasurementPeriodTickStart = Util.EnvironmentTickCount(); | ||
478 | MeasurementPeriodExecutionTime = 0; | ||
479 | |||
462 | if (EventQueue.Count > 0) | 480 | if (EventQueue.Count > 0) |
463 | { | 481 | { |
464 | if (m_CurrentWorkItem == null) | 482 | if (m_CurrentWorkItem == null) |
@@ -712,8 +730,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
712 | m_EventStart = DateTime.Now; | 730 | m_EventStart = DateTime.Now; |
713 | m_InEvent = true; | 731 | m_InEvent = true; |
714 | 732 | ||
733 | int start = Util.EnvironmentTickCount(); | ||
734 | |||
735 | // Reset the measurement period when we reach the end of the current one. | ||
736 | if (start - MeasurementPeriodTickStart > MaxMeasurementPeriod) | ||
737 | MeasurementPeriodTickStart = start; | ||
738 | |||
715 | m_Script.ExecuteEvent(State, data.EventName, data.Params); | 739 | m_Script.ExecuteEvent(State, data.EventName, data.Params); |
716 | 740 | ||
741 | MeasurementPeriodExecutionTime += Util.EnvironmentTickCount() - start; | ||
742 | |||
717 | m_InEvent = false; | 743 | m_InEvent = false; |
718 | m_CurrentEvent = String.Empty; | 744 | m_CurrentEvent = String.Empty; |
719 | 745 | ||
@@ -722,7 +748,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
722 | // This will be the very first event we deliver | 748 | // This will be the very first event we deliver |
723 | // (state_entry) in default state | 749 | // (state_entry) in default state |
724 | // | 750 | // |
725 | |||
726 | SaveState(m_Assembly); | 751 | SaveState(m_Assembly); |
727 | 752 | ||
728 | m_SaveState = false; | 753 | m_SaveState = false; |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index ee5f519..eb10975 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -448,6 +448,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
448 | if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) | 448 | if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_Scene)) |
449 | return; | 449 | return; |
450 | 450 | ||
451 | MainConsole.Instance.OutputFormat(GetStatusReport()); | ||
452 | } | ||
453 | |||
454 | public string GetStatusReport() | ||
455 | { | ||
451 | StringBuilder sb = new StringBuilder(); | 456 | StringBuilder sb = new StringBuilder(); |
452 | sb.AppendFormat("Status of XEngine instance for {0}\n", m_Scene.RegionInfo.RegionName); | 457 | sb.AppendFormat("Status of XEngine instance for {0}\n", m_Scene.RegionInfo.RegionName); |
453 | 458 | ||
@@ -475,7 +480,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
475 | Listener l = AsyncCommandManager.GetListenerPlugin(this); | 480 | Listener l = AsyncCommandManager.GetListenerPlugin(this); |
476 | sb.AppendFormat("Listeners : {0}\n", l.ListenerCount); | 481 | sb.AppendFormat("Listeners : {0}\n", l.ListenerCount); |
477 | 482 | ||
478 | MainConsole.Instance.OutputFormat(sb.ToString()); | 483 | return sb.ToString(); |
479 | } | 484 | } |
480 | 485 | ||
481 | public void HandleShowScripts(string module, string[] cmdparams) | 486 | public void HandleShowScripts(string module, string[] cmdparams) |
@@ -1154,7 +1159,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1154 | 1159 | ||
1155 | if (!m_PrimObjects[localID].Contains(itemID)) | 1160 | if (!m_PrimObjects[localID].Contains(itemID)) |
1156 | m_PrimObjects[localID].Add(itemID); | 1161 | m_PrimObjects[localID].Add(itemID); |
1157 | |||
1158 | } | 1162 | } |
1159 | 1163 | ||
1160 | if (!m_Assemblies.ContainsKey(assetID)) | 1164 | if (!m_Assemblies.ContainsKey(assetID)) |
@@ -1981,6 +1985,59 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1981 | } | 1985 | } |
1982 | } | 1986 | } |
1983 | 1987 | ||
1988 | public Dictionary<uint, float> GetObjectScriptsExecutionTimes() | ||
1989 | { | ||
1990 | long tickNow = Util.EnvironmentTickCount(); | ||
1991 | Dictionary<uint, float> topScripts = new Dictionary<uint, float>(); | ||
1992 | |||
1993 | lock (m_Scripts) | ||
1994 | { | ||
1995 | foreach (IScriptInstance si in m_Scripts.Values) | ||
1996 | { | ||
1997 | if (!topScripts.ContainsKey(si.LocalID)) | ||
1998 | topScripts[si.RootLocalID] = 0; | ||
1999 | |||
2000 | // long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | ||
2001 | // float framesElapsed = ticksElapsed / (18.1818 * TimeSpan.TicksPerMillisecond); | ||
2002 | |||
2003 | // Execution time of the script adjusted by it's measurement period to make scripts started at | ||
2004 | // different times comparable. | ||
2005 | // float adjustedExecutionTime | ||
2006 | // = (float)si.MeasurementPeriodExecutionTime | ||
2007 | // / ((float)(tickNow - si.MeasurementPeriodTickStart) / ScriptInstance.MaxMeasurementPeriod) | ||
2008 | // / TimeSpan.TicksPerMillisecond; | ||
2009 | |||
2010 | long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | ||
2011 | |||
2012 | // Avoid divide by zerp | ||
2013 | if (ticksElapsed == 0) | ||
2014 | ticksElapsed = 1; | ||
2015 | |||
2016 | // Scale execution time to the ideal 55 fps frame time for these reasons. | ||
2017 | // | ||
2018 | // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no | ||
2019 | // 'script execution time per frame', which is the original purpose of this value. | ||
2020 | // | ||
2021 | // 2) Giving the raw execution times is misleading since scripts start at different times, making | ||
2022 | // it impossible to compare scripts. | ||
2023 | // | ||
2024 | // 3) Scaling the raw execution time to the time that the script has been running is better but | ||
2025 | // is still misleading since a script that has just been rezzed may appear to have been running | ||
2026 | // for much longer. | ||
2027 | // | ||
2028 | // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect | ||
2029 | // since the figure does not represent actual execution time and very hard running scripts will | ||
2030 | // never exceed 18ms (though this is a very high number for script execution so is a warning sign). | ||
2031 | float adjustedExecutionTime | ||
2032 | = ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f; | ||
2033 | |||
2034 | topScripts[si.RootLocalID] += adjustedExecutionTime; | ||
2035 | } | ||
2036 | } | ||
2037 | |||
2038 | return topScripts; | ||
2039 | } | ||
2040 | |||
1984 | public void SuspendScript(UUID itemID) | 2041 | public void SuspendScript(UUID itemID) |
1985 | { | 2042 | { |
1986 | // m_log.DebugFormat("[XEngine]: Received request to suspend script with ID {0}", itemID); | 2043 | // m_log.DebugFormat("[XEngine]: Received request to suspend script with ID {0}", itemID); |