diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 1e175cde63..6dac7da75b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -97,6 +97,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
protected IScriptEngine m_ScriptEngine;
+ public Scene World;
+
protected SceneObjectPart m_host;
protected UUID RegionScopeID = UUID.Zero;
@@ -390,6 +392,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_lastSayShoutCheck = DateTime.UtcNow;
m_ScriptEngine = scriptEngine;
+ World = m_ScriptEngine.World;
m_host = host;
m_item = item;
m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
@@ -562,16 +565,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_ScriptEngine.SleepScript(m_item.ItemID, delay);
}
- ///
- /// Check for co-operative termination.
- ///
- /// If called with 0, then just the check is performed with no wait.
-
- public Scene World
- {
- get { return m_ScriptEngine.World; }
- }
-
[DebuggerNonUserCode]
public void state(string newState)
{
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 714e3c93b7..52f1083492 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -162,10 +162,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
protected IEnvironmentModule m_envModule = null;
protected IGroupsModule m_groupsModule = null;
protected IMessageTransferModule m_TransferModule = null;
+
+ public Scene World;
+
public void Initialize(IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item)
{
//private init
m_ScriptEngine = scriptEngine;
+ World = scriptEngine.World;
+
m_host = host;
m_item = item;
@@ -250,11 +255,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
}
- public Scene World
- {
- get { return m_ScriptEngine.World; }
- }
-
internal static void OSSLError(string msg)
{
throw new ScriptException("OSSL Runtime Error: " + msg);
@@ -6356,14 +6356,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public LSL_Integer osGetPrimCount(LSL_Key object_id)
{
- if (!UUID.TryParse(object_id, out UUID id) || id.IsZero())
+ if (!UUID.TryParse(object_id.m_string, out UUID id) || id.IsZero())
return 0;
- SceneObjectPart part = World.GetSceneObjectPart(id);
- if (part is null)
- return 0;
-
- return part.ParentGroup.PrimCount;
+ return World.TryGetSceneObjectPart(id, out SceneObjectPart part) ? part.ParentGroup.PrimCount : 0;
}
public LSL_Integer osGetSittingAvatarsCount()
@@ -6373,14 +6369,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public LSL_Integer osGetSittingAvatarsCount(LSL_Key object_id)
{
- if (!UUID.TryParse(object_id, out UUID id) || id.IsZero())
+ if (!UUID.TryParse(object_id.m_string, out UUID id) || id.IsZero())
return 0;
- SceneObjectPart part = World.GetSceneObjectPart(id);
- if (part is null)
- return 0;
-
- return part.ParentGroup.GetSittingAvatarsCount();
+ return World.TryGetSceneObjectPart(id, out SceneObjectPart part) ? part.ParentGroup.GetSittingAvatarsCount() : 0;
}
}
}
\ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/YEngine/XMREngine.cs b/OpenSim/Region/ScriptEngine/YEngine/XMREngine.cs
index b4777d9d9f..0c423b3956 100644
--- a/OpenSim/Region/ScriptEngine/YEngine/XMREngine.cs
+++ b/OpenSim/Region/ScriptEngine/YEngine/XMREngine.cs
@@ -45,6 +45,7 @@ using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Reflection.Emit;
+using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Timers;
@@ -65,9 +66,8 @@ using SceneScriptEvents = OpenSim.Region.Framework.Scenes.scriptEvents;
namespace OpenSim.Region.ScriptEngine.Yengine
{
- [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "YEngine")]
- public partial class Yengine: INonSharedRegionModule, IScriptEngine,
- IScriptModule
+ [Mono.Addins.Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "YEngine")]
+ public partial class Yengine: INonSharedRegionModule, IScriptEngine, IScriptModule
{
public static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -124,6 +124,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
public string Name
{
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
return "YEngine";
@@ -132,6 +133,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
public Type ReplaceableInterface
{
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
return null;
@@ -140,6 +142,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
public string ScriptEnginePath
{
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
return m_ScriptBasePath;
@@ -148,6 +151,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
public string ScriptClassName
{
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
return "YEngineScript";
@@ -156,6 +160,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
public string ScriptBaseClassName
{
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
return typeof(XMRInstance).FullName;
@@ -164,6 +169,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
public ParameterInfo[] ScriptBaseClassParameters
{
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
return typeof(XMRInstance).GetConstructor(new Type[] { typeof(WaitHandle) }).GetParameters();
@@ -172,6 +178,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
public string[] ScriptReferencedAssemblies
{
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
return scriptReferencedAssemblies;
@@ -863,6 +870,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
// Not required when not using IScriptInstance
//
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public IScriptWorkItem QueueEventHandler(object parms)
{
return null;
@@ -870,6 +878,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
public Scene World
{
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
return m_Scene;
@@ -878,6 +887,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
public IScriptModule ScriptModule
{
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
return this;
@@ -896,27 +906,26 @@ namespace OpenSim.Region.ScriptEngine.Yengine
// Events targeted at a specific script
// ... like listen() for an llListen() call
- //
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool PostScriptEvent(UUID itemID, EventParams parms)
{
- XMRInstance instance = GetInstance(itemID);
- if (instance == null)
- return false;
-
- TraceCalls("[YEngine]: YEngine.PostScriptEvent({0},{1})", itemID.ToString(), parms.EventName);
-
- return instance.PostEvent(parms);
+ if (TryGetInstance(itemID, out XMRInstance instance))
+ {
+ TraceCalls("[YEngine]: YEngine.PostScriptEvent({0},{1})", itemID.ToString(), parms.EventName);
+ return instance.PostEvent(parms);
+ }
+ return false;
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CancelScriptEvent(UUID itemID, string eventName)
{
- XMRInstance instance = GetInstance(itemID);
- if (instance == null)
- return;
-
- TraceCalls("[YEngine]: YEngine.CancelScriptEvent({0},{1})", itemID.ToString(), eventName);
-
- instance.CancelEvent(eventName);
+ if (TryGetInstance(itemID, out XMRInstance instance))
+ {
+ TraceCalls("[YEngine]: YEngine.CancelScriptEvent({0},{1})", itemID.ToString(), eventName);
+ instance.CancelEvent(eventName);
+ }
}
// Events targeted at all scripts in the given prim.
@@ -980,19 +989,17 @@ namespace OpenSim.Region.ScriptEngine.Yengine
private bool PostPrimEvent(SceneObjectPart part, EventParams parms)
{
- UUID partUUID = part.UUID;
-
// Get list of script instances running in the object.
XMRInstance[] objInstArray;
lock(m_InstancesDict)
{
- if(!m_ObjectInstArray.TryGetValue(partUUID, out objInstArray))
+ if(!m_ObjectInstArray.TryGetValue(part.UUID, out objInstArray))
return false;
if (objInstArray == null)
{
- objInstArray = RebuildObjectInstArray(partUUID);
- m_ObjectInstArray[partUUID] = objInstArray;
+ objInstArray = RebuildObjectInstArray(part.UUID);
+ m_ObjectInstArray[part.UUID] = objInstArray;
}
}
@@ -1007,39 +1014,40 @@ namespace OpenSim.Region.ScriptEngine.Yengine
return posted;
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public DetectParams GetDetectParams(UUID itemID, int number)
{
- XMRInstance instance = GetInstance(itemID);
- if(instance == null)
- return null;
- return instance.GetDetectParams(number);
+ if (TryGetInstance(itemID, out XMRInstance instance))
+ return instance.GetDetectParams(number);
+ return null;
}
public void SetMinEventDelay(UUID itemID, double delay)
{
- XMRInstance instance = GetInstance(itemID);
- if (instance != null)
+ if (TryGetInstance(itemID, out XMRInstance instance))
instance.MinEventDelay = delay;
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetStartParameter(UUID itemID)
{
- XMRInstance instance = GetInstance(itemID);
- if (instance == null)
- return 0;
- return instance.StartParam;
+ if (TryGetInstance(itemID, out XMRInstance instance))
+ return instance.StartParam;
+ return 0;
}
// This is the "set running" method
- //
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetScriptState(UUID itemID, bool state, bool self)
{
SetScriptState(itemID, state);
}
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetScriptState(UUID itemID, bool state)
{
- XMRInstance instance = GetInstance(itemID);
- if(instance != null)
+ if (TryGetInstance(itemID, out XMRInstance instance))
{
instance.Running = state;
if(instance.m_Item != null)
@@ -1048,29 +1056,31 @@ namespace OpenSim.Region.ScriptEngine.Yengine
}
//
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool GetScriptState(UUID itemID)
{
- XMRInstance instance = GetInstance(itemID);
- if(instance == null)
- return false;
- return instance.Running;
+ if (TryGetInstance(itemID, out XMRInstance instance))
+ return instance.Running;
+ return false;
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetState(UUID itemID, string newState)
{
TraceCalls("[YEngine]: YEngine.SetState({0},{1})", itemID.ToString(), newState);
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ApiResetScript(UUID itemID)
{
- XMRInstance instance = GetInstance(itemID);
- instance?.ApiReset();
+ if (TryGetInstance(itemID, out XMRInstance instance))
+ instance.ApiReset();
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ResetScript(UUID itemID)
{
- XMRInstance instance = GetInstance(itemID);
- if(instance != null)
+ if (TryGetInstance(itemID, out XMRInstance instance))
{
IUrlModule urlModule = m_Scene.RequestModuleInterface();
urlModule?.ScriptRemoved(itemID);
@@ -1081,6 +1091,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
public IConfig Config
{
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
return m_Config;
@@ -1089,6 +1100,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
public IConfigSource ConfigSource
{
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
return m_ConfigSource;
@@ -1097,20 +1109,22 @@ namespace OpenSim.Region.ScriptEngine.Yengine
public string ScriptEngineName
{
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
return "YEngine";
}
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public IScriptApi GetApi(UUID itemID, string name)
{
- if(!m_XMRInstanceApiCtxFieldInfos.TryGetValue(name, out FieldInfo fi))
- return null;
- XMRInstance inst = GetInstance(itemID);
- if(inst == null)
- return null;
- return (IScriptApi)fi.GetValue(inst);
+ if(m_XMRInstanceApiCtxFieldInfos.TryGetValue(name, out FieldInfo fi))
+ {
+ if (TryGetInstance(itemID, out XMRInstance instance))
+ return (IScriptApi)fi.GetValue(instance);
+ }
+ return null;
}
/**
@@ -1220,6 +1234,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
return true;
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool PostScriptEvent(UUID itemID, string name, Object[] p)
{
if(!m_Enabled)
@@ -1230,6 +1245,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
return PostScriptEvent(itemID, new EventParams(name, p, zeroDetectParams));
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool PostObjectEvent(UUID itemID, string name, Object[] p)
{
if(!m_Enabled)
@@ -1237,18 +1253,17 @@ namespace OpenSim.Region.ScriptEngine.Yengine
TraceCalls("[YEngine]: YEngine.PostObjectEvent({0},{1})", itemID.ToString(), name);
- SceneObjectPart part = m_Scene.GetSceneObjectPart(itemID);
- if(part == null)
- return false;
-
- return PostObjectEvent(part.LocalId, new EventParams(name, p, zeroDetectParams));
+ if(m_Scene.TryGetSceneObjectPart(itemID, out SceneObjectPart part))
+ return PostObjectEvent(part.LocalId, new EventParams(name, p, zeroDetectParams));
+ return false;
}
// about the 3523rd entrypoint for a script to put itself to sleep
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SleepScript(UUID itemID, int delay)
{
- XMRInstance instance = GetInstance(itemID);
- instance?.Sleep(delay);
+ if (TryGetInstance(itemID, out XMRInstance instance))
+ instance.Sleep(delay);
}
// Get a script instance loaded, compiling it if necessary
@@ -1534,16 +1549,17 @@ namespace OpenSim.Region.ScriptEngine.Yengine
instance.Dispose();
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void OnScriptReset(uint localID, UUID itemID)
{
TraceCalls("[YEngine]: YEngine.OnScriptReset({0},{1})", localID.ToString(), itemID.ToString());
ResetScript(itemID);
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void OnStartScript(uint localID, UUID itemID)
{
- XMRInstance instance = GetInstance(itemID);
- if(instance != null)
+ if (TryGetInstance(itemID, out XMRInstance instance))
{
instance.Running = true;
if (instance.m_Item != null)
@@ -1551,10 +1567,10 @@ namespace OpenSim.Region.ScriptEngine.Yengine
}
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void OnStopScript(uint localID, UUID itemID)
{
- XMRInstance instance = GetInstance(itemID);
- if(instance != null)
+ if (TryGetInstance(itemID, out XMRInstance instance))
{
instance.Running = false;
if (instance.m_Item != null)
@@ -1562,11 +1578,11 @@ namespace OpenSim.Region.ScriptEngine.Yengine
}
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void OnGetScriptRunning(IClientAPI controllingClient,
UUID objectID, UUID itemID)
{
- XMRInstance instance = GetInstance(itemID);
- if(instance != null)
+ if (TryGetInstance(itemID, out XMRInstance instance))
{
TraceCalls("[YEngine]: YEngine.OnGetScriptRunning({0},{1})", objectID.ToString(), itemID.ToString());
@@ -1576,22 +1592,24 @@ namespace OpenSim.Region.ScriptEngine.Yengine
}
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool HasScript(UUID itemID, out bool running)
{
- XMRInstance instance = GetInstance(itemID);
- if(instance == null)
+ if (TryGetInstance(itemID, out XMRInstance instance))
{
running = true;
return false;
}
- running = instance.Running;
- return true;
+ running = true;
+ return false;
}
/**
* @brief Called once per frame update to see if scripts have
* any such work to do.
*/
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
private void OnFrame()
{
if(m_FrameUpdateList != null)
@@ -1620,6 +1638,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine
* @brief Gets called early as part of shutdown,
* right after "Persisting changed objects" message.
*/
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void OnShutdown()
{
TraceCalls("[YEngine]: YEngine.OnShutdown()");
@@ -1634,6 +1654,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine
* we don't get two threads trying to queue the same
* instance to the m_StartQueue at the same time.
*/
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void QueueToStart(XMRInstance inst)
{
if (inst.m_IState != XMRInstState.ONSTARTQ)
@@ -1645,6 +1667,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
WakeUpOne();
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void QueueToYield(XMRInstance inst)
{
if (inst.m_IState != XMRInstState.ONYIELDQ)
@@ -1656,6 +1679,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
WakeUpOne();
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void RemoveFromSleep(XMRInstance inst)
{
lock (m_SleepQueue)
@@ -1840,16 +1864,16 @@ namespace OpenSim.Region.ScriptEngine.Yengine
}
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Suspend(UUID itemID, int ms)
{
- XMRInstance instance = GetInstance(itemID);
- instance?.Sleep(ms);
+ if (TryGetInstance(itemID, out XMRInstance instance))
+ instance.Sleep(ms);
}
public void Die(UUID itemID)
{
- XMRInstance instance = GetInstance(itemID);
- if(instance != null)
+ if (TryGetInstance(itemID, out XMRInstance instance))
{
TraceCalls("[YEngine]: YEngine.Die({0})", itemID.ToString());
instance.Die();
@@ -1864,17 +1888,33 @@ namespace OpenSim.Region.ScriptEngine.Yengine
* @returns null: not one of our scripts (maybe XEngine etc)
* else: points to the script instance
*/
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public XMRInstance GetInstance(UUID itemID)
{
XMRInstance instance;
- lock(m_InstancesDict)
+ lock (m_InstancesDict)
{
- if(!m_InstancesDict.TryGetValue(itemID, out instance))
+ if (!m_InstancesDict.TryGetValue(itemID, out instance))
instance = null;
}
return instance;
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public bool TryGetInstance(UUID itemID, out XMRInstance instance)
+ {
+ lock (m_InstancesDict)
+ return m_InstancesDict.TryGetValue(itemID, out instance);
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public bool ConstainsInstance(UUID itemID)
+ {
+ lock (m_InstancesDict)
+ return m_InstancesDict.ContainsKey(itemID);
+ }
+
// Called occasionally to write script state to .state file so the
// script will restart from its last known state if the region crashes
// and gets restarted.
@@ -1990,8 +2030,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
float time = 0;
foreach(UUID itemID in itemIDs)
{
- XMRInstance instance = GetInstance(itemID);
- if((instance != null) && instance.Running)
+ if (TryGetInstance(itemID, out XMRInstance instance) && instance.Running)
time += (float)instance.m_CPUTime;
}
return time;
@@ -2005,8 +2044,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
int memory = 0;
foreach (UUID itemID in itemIDs)
{
- XMRInstance instance = GetInstance(itemID);
- if ((instance != null) && instance.Running)
+ if (TryGetInstance(itemID, out XMRInstance instance) && instance.Running)
memory += instance.xmrHeapUsed();
}
return memory;
@@ -2017,8 +2055,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
*/
public bool SuspendScript(UUID itemID)
{
- XMRInstance instance = GetInstance(itemID);
- if(instance != null)
+ if (TryGetInstance(itemID, out XMRInstance instance))
{
TraceCalls("[YEngine]: YEngine.SuspendScript({0})", itemID.ToString());
instance.SuspendIt();
@@ -2032,8 +2069,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
*/
public bool ResumeScript(UUID itemID)
{
- XMRInstance instance = GetInstance(itemID);
- if(instance != null)
+ if (TryGetInstance(itemID, out XMRInstance instance))
{
TraceCalls("[YEngine]: YEngine.ResumeScript({0})", itemID.ToString());
instance.ResumeIt();