Merge branch 'master' of /home/opensim/var/repo/opensim
						commit
						9babd79a66
					
				|  | @ -172,7 +172,17 @@ namespace OpenSim.Region.Framework.Interfaces | |||
|         /// If no inventory item has that name then an empty list is returned. | ||||
|         /// </returns> | ||||
|         List<TaskInventoryItem> GetInventoryItems(string name); | ||||
|          | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Get inventory items by type. | ||||
|         /// </summary> | ||||
|         /// <param type="name"></param> | ||||
|         /// <returns> | ||||
|         /// A list of inventory items of that type. | ||||
|         /// If no inventory items of that type then an empty list is returned. | ||||
|         /// </returns> | ||||
|         List<TaskInventoryItem> GetInventoryItems(InventoryType type); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Get the scene object referenced by an inventory item. | ||||
|         /// </summary> | ||||
|  |  | |||
|  | @ -82,6 +82,14 @@ namespace OpenSim.Region.Framework.Interfaces | |||
|         /// </summary> | ||||
|         void StartProcessing(); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Get the execution times of all scripts in the given array if they are currently running. | ||||
|         /// </summary> | ||||
|         /// <returns> | ||||
|         /// A float the value is a representative execution time in milliseconds of all scripts in that Array. | ||||
|         /// </returns> | ||||
|         float GetScriptExecutionTime(List<UUID> itemIDs); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Get the execution times of all scripts in each object. | ||||
|         /// </summary> | ||||
|  |  | |||
|  | @ -3269,6 +3269,45 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             return count; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// A float the value is a representative execution time in milliseconds of all scripts in the link set. | ||||
|         /// </summary> | ||||
|         public float ScriptExecutionTime() | ||||
|         { | ||||
|             IScriptModule[] engines = Scene.RequestModuleInterfaces<IScriptModule>(); | ||||
| 
 | ||||
|             if (engines.Length == 0) // No engine at all | ||||
|                 return 0.0f; | ||||
| 
 | ||||
|             float time = 0.0f; | ||||
| 
 | ||||
|             // get all the scripts in all parts | ||||
|             SceneObjectPart[] parts = m_parts.GetArray(); | ||||
|             List<TaskInventoryItem> scripts = new List<TaskInventoryItem>(); | ||||
|             for (int i = 0; i < parts.Length; i++) | ||||
|             { | ||||
|                 scripts.AddRange(parts[i].Inventory.GetInventoryItems(InventoryType.LSL)); | ||||
|             } | ||||
|             // extract the UUIDs | ||||
|             List<UUID> ids = new List<UUID>(scripts.Count); | ||||
|             foreach (TaskInventoryItem script in scripts) | ||||
|             { | ||||
|                 if (!ids.Contains(script.ItemID)) | ||||
|                 { | ||||
|                     ids.Add(script.ItemID); | ||||
|                 } | ||||
|             } | ||||
|             // Offer the list of script UUIDs to each engine found and accumulate the time | ||||
|             foreach (IScriptModule e in engines) | ||||
|             { | ||||
|                 if (e != null) | ||||
|                 { | ||||
|                     time += e.GetScriptExecutionTime(ids); | ||||
|                 } | ||||
|             } | ||||
|             return time; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Returns a count of the number of running scripts in this groups parts. | ||||
|         /// </summary> | ||||
|  |  | |||
|  | @ -222,7 +222,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         /// </summary> | ||||
|         public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) | ||||
|         { | ||||
|             List<TaskInventoryItem> scripts = GetInventoryScripts(); | ||||
|             List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); | ||||
|             foreach (TaskInventoryItem item in scripts) | ||||
|                 CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); | ||||
|         } | ||||
|  | @ -255,7 +255,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         /// </param> | ||||
|         public void RemoveScriptInstances(bool sceneObjectBeingDeleted) | ||||
|         { | ||||
|             List<TaskInventoryItem> scripts = GetInventoryScripts(); | ||||
|             List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); | ||||
|             foreach (TaskInventoryItem item in scripts) | ||||
|                 RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted); | ||||
|         } | ||||
|  | @ -1116,7 +1116,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                 return 0; | ||||
| 
 | ||||
|             int count = 0; | ||||
|             List<TaskInventoryItem> scripts = GetInventoryScripts(); | ||||
|             List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); | ||||
| 
 | ||||
|             foreach (TaskInventoryItem item in scripts) | ||||
|             { | ||||
|  | @ -1157,14 +1157,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             return ret; | ||||
|         } | ||||
| 
 | ||||
|         public List<TaskInventoryItem> GetInventoryScripts() | ||||
|         public List<TaskInventoryItem> GetInventoryItems(InventoryType type) | ||||
|         { | ||||
|             List<TaskInventoryItem> ret = new List<TaskInventoryItem>(); | ||||
| 
 | ||||
|             lock (m_items) | ||||
|             { | ||||
|                 foreach (TaskInventoryItem item in m_items.Values) | ||||
|                     if (item.InvType == (int)InventoryType.LSL) | ||||
|                     if (item.InvType == (int)type) | ||||
|                         ret.Add(item); | ||||
|             } | ||||
| 
 | ||||
|  | @ -1183,7 +1183,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             if (engines.Length == 0) // No engine at all | ||||
|                 return ret; | ||||
| 
 | ||||
|             List<TaskInventoryItem> scripts = GetInventoryScripts(); | ||||
|             List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); | ||||
| 
 | ||||
|             foreach (TaskInventoryItem item in scripts) | ||||
|             { | ||||
|  | @ -1211,7 +1211,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             if (engines.Length == 0) | ||||
|                 return; | ||||
| 
 | ||||
|             List<TaskInventoryItem> scripts = GetInventoryScripts(); | ||||
|             List<TaskInventoryItem> scripts = GetInventoryItems(InventoryType.LSL); | ||||
| 
 | ||||
|             foreach (TaskInventoryItem item in scripts) | ||||
|             { | ||||
|  |  | |||
|  | @ -3437,6 +3437,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             return count; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// A float the value is a representative execution time in milliseconds of all scripts in all attachments. | ||||
|         /// </summary> | ||||
|         public float ScriptExecutionTime() | ||||
|         { | ||||
|             float time = 0.0f; | ||||
|             lock (m_attachments) | ||||
|             { | ||||
|                 foreach (SceneObjectGroup gobj in m_attachments) | ||||
|                 { | ||||
|                     if (gobj != null) | ||||
|                     { | ||||
|                         time += gobj.ScriptExecutionTime(); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             return time; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Returns the total count of running scripts in all parts. | ||||
|         /// </summary> | ||||
|  |  | |||
|  | @ -10367,7 +10367,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
|                                 ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384)); | ||||
|                                 break; | ||||
|                             case ScriptBaseClass.OBJECT_SCRIPT_TIME: | ||||
|                                 ret.Add(new LSL_Float(0)); | ||||
|                                 ret.Add(new LSL_Float(av.ScriptExecutionTime() / 1000.0f)); | ||||
|                                 break; | ||||
|                             case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: | ||||
|                                 ret.Add(new LSL_Integer(1)); | ||||
|  | @ -10435,9 +10435,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
|                                 ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384)); | ||||
|                                 break; | ||||
|                             case ScriptBaseClass.OBJECT_SCRIPT_TIME: | ||||
|                                 // Average cpu time per simulator frame expended on all scripts in the object | ||||
|                                 // Not currently available at Object level | ||||
|                                 ret.Add(new LSL_Float(0)); | ||||
|                                 // Average cpu time in seconds per simulator frame expended on all scripts in the object | ||||
|                                 ret.Add(new LSL_Float(obj.ParentGroup.ScriptExecutionTime() / 1000.0f)); | ||||
|                                 break; | ||||
|                             case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: | ||||
|                                 // according to the SL wiki A prim or linkset will have prim | ||||
|  |  | |||
|  | @ -1907,47 +1907,61 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
|                     if (!topScripts.ContainsKey(si.LocalID)) | ||||
|                         topScripts[si.RootLocalID] = 0; | ||||
| 
 | ||||
| //                    long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | ||||
| //                    float framesElapsed = ticksElapsed / (18.1818 * TimeSpan.TicksPerMillisecond); | ||||
| 
 | ||||
|                     // Execution time of the script adjusted by it's measurement period to make scripts started at | ||||
|                     // different times comparable. | ||||
| //                    float adjustedExecutionTime | ||||
| //                        = (float)si.MeasurementPeriodExecutionTime | ||||
| //                            / ((float)(tickNow - si.MeasurementPeriodTickStart) / ScriptInstance.MaxMeasurementPeriod) | ||||
| //                            / TimeSpan.TicksPerMillisecond; | ||||
| 
 | ||||
|                     long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | ||||
| 
 | ||||
|                     // Avoid divide by zerp | ||||
|                     if (ticksElapsed == 0) | ||||
|                         ticksElapsed = 1; | ||||
| 
 | ||||
|                     // Scale execution time to the ideal 55 fps frame time for these reasons. | ||||
|                     // | ||||
|                     // 1) XEngine does not execute scripts per frame, unlike other script engines.  Hence, there is no | ||||
|                     // 'script execution time per frame', which is the original purpose of this value. | ||||
|                     // | ||||
|                     // 2) Giving the raw execution times is misleading since scripts start at different times, making | ||||
|                     // it impossible to compare scripts. | ||||
|                     // | ||||
|                     // 3) Scaling the raw execution time to the time that the script has been running is better but | ||||
|                     // is still misleading since a script that has just been rezzed may appear to have been running | ||||
|                     // for much longer. | ||||
|                     // | ||||
|                     // 4) Hence, we scale execution time to an idealised frame time (55 fps).  This is also not perfect | ||||
|                     // since the figure does not represent actual execution time and very hard running scripts will | ||||
|                     // never exceed 18ms (though this is a very high number for script execution so is a warning sign). | ||||
|                     float adjustedExecutionTime | ||||
|                         = ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f; | ||||
| 
 | ||||
|                     topScripts[si.RootLocalID] += adjustedExecutionTime; | ||||
|                     topScripts[si.RootLocalID] += CalculateAdjustedExectionTime(si, tickNow); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             return topScripts; | ||||
|         } | ||||
| 
 | ||||
|         public float GetScriptExecutionTime(List<UUID> itemIDs) | ||||
|         { | ||||
|             if (itemIDs == null|| itemIDs.Count == 0) | ||||
|             { | ||||
|                 return 0.0f; | ||||
|             } | ||||
|             float time = 0.0f; | ||||
|             long tickNow = Util.EnvironmentTickCount(); | ||||
|             IScriptInstance si; | ||||
|             // Calculate the time for all scripts that this engine is executing | ||||
|             // Ignore any others | ||||
|             foreach (UUID id in itemIDs) | ||||
|             { | ||||
|                 si = GetInstance(id); | ||||
|                 if (si != null && si.Running) | ||||
|                 { | ||||
|                     time += CalculateAdjustedExectionTime(si, tickNow); | ||||
|                 } | ||||
|             } | ||||
|             return time; | ||||
|         } | ||||
| 
 | ||||
|         private float CalculateAdjustedExectionTime(IScriptInstance si, long tickNow) | ||||
|         { | ||||
|             long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | ||||
| 
 | ||||
|             // Avoid divide by zero | ||||
|             if (ticksElapsed == 0) | ||||
|                 ticksElapsed = 1; | ||||
| 
 | ||||
|             // Scale execution time to the ideal 55 fps frame time for these reasons. | ||||
|             // | ||||
|             // 1) XEngine does not execute scripts per frame, unlike other script engines.  Hence, there is no | ||||
|             // 'script execution time per frame', which is the original purpose of this value. | ||||
|             // | ||||
|             // 2) Giving the raw execution times is misleading since scripts start at different times, making | ||||
|             // it impossible to compare scripts. | ||||
|             // | ||||
|             // 3) Scaling the raw execution time to the time that the script has been running is better but | ||||
|             // is still misleading since a script that has just been rezzed may appear to have been running | ||||
|             // for much longer. | ||||
|             // | ||||
|             // 4) Hence, we scale execution time to an idealised frame time (55 fps).  This is also not perfect | ||||
|             // since the figure does not represent actual execution time and very hard running scripts will | ||||
|             // never exceed 18ms (though this is a very high number for script execution so is a warning sign). | ||||
|             return ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f; | ||||
|         } | ||||
| 
 | ||||
|         public void SuspendScript(UUID itemID) | ||||
|         { | ||||
| //            m_log.DebugFormat("[XEngine]: Received request to suspend script with ID {0}", itemID); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 BlueWall
						BlueWall