From 218902bedc7f430c8401426a1cee373bfc0b5485 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Wed, 24 Sep 2008 02:58:05 +0000 Subject: Decouple AsyncCommands from XEngine and the script instance. Make all methods needed outside the API ststic. Async command processing is now wholly internal to the API. This sets the stage for the next convergence step. --- .../Api/Implementation/AsyncCommandManager.cs | 171 ++++++++++++--------- .../Shared/Api/Implementation/LSL_Api.cs | 2 +- .../Api/Implementation/Plugins/HttpRequest.cs | 4 +- .../Api/Implementation/Plugins/XmlRequest.cs | 8 +- 4 files changed, 104 insertions(+), 81 deletions(-) (limited to 'OpenSim/Region/ScriptEngine/Shared/Api') diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs index f331b5c..fabcc2c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs @@ -47,66 +47,86 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api private static Thread cmdHandlerThread; private static int cmdHandlerThreadCycleSleepms; - private static List m_Managers = new List(); - public IScriptEngine m_ScriptEngine; + private static List m_Scenes = new List(); + private static List m_ScriptEngines = + new List(); - private Dataserver m_Dataserver; - private Timer m_Timer; - private HttpRequest m_HttpRequest; - private Listener m_Listener; - private SensorRepeat m_SensorRepeat; - private XmlRequest m_XmlRequest; + public IScriptEngine m_ScriptEngine; + private IScene m_Scene; + + private static Dictionary m_Dataserver = + new Dictionary(); + private static Dictionary m_Timer = + new Dictionary(); + private static Dictionary m_Listener = + new Dictionary(); + private static Dictionary m_HttpRequest = + new Dictionary(); + private static Dictionary m_SensorRepeat = + new Dictionary(); + private static Dictionary m_XmlRequest = + new Dictionary(); public Dataserver DataserverPlugin { - get { return m_Dataserver; } + get { return m_Dataserver[m_Scene]; } } public Timer TimerPlugin { - get { return m_Timer; } + get { return m_Timer[m_Scene]; } } public HttpRequest HttpRequestPlugin { - get { return m_HttpRequest; } + get { return m_HttpRequest[m_Scene]; } } public Listener ListenerPlugin { - get { return m_Listener; } + get { return m_Listener[m_Scene]; } } public SensorRepeat SensorRepeatPlugin { - get { return m_SensorRepeat; } + get { return m_SensorRepeat[m_Scene]; } } public XmlRequest XmlRequestPlugin { - get { return m_XmlRequest; } + get { return m_XmlRequest[m_Scene]; } } - public AsyncCommandManager[] Managers + public IScriptEngine[] ScriptEngines { - get { return m_Managers.ToArray(); } + get { return m_ScriptEngines.ToArray(); } } public AsyncCommandManager(IScriptEngine _ScriptEngine) { m_ScriptEngine = _ScriptEngine; - if (!m_Managers.Contains(this)) - m_Managers.Add(this); + m_Scene = m_ScriptEngine.World; + + if (!m_Scenes.Contains(m_Scene)) + m_Scenes.Add(m_Scene); + if (!m_ScriptEngines.Contains(m_ScriptEngine)) + m_ScriptEngines.Add(m_ScriptEngine); ReadConfig(); // Create instances of all plugins - m_Dataserver = new Dataserver(this); - m_Timer = new Timer(this); - m_HttpRequest = new HttpRequest(this); - m_Listener = new Listener(this); - m_SensorRepeat = new SensorRepeat(this); - m_XmlRequest = new XmlRequest(this); + if (!m_Dataserver.ContainsKey(m_Scene)) + m_Dataserver[m_Scene] = new Dataserver(this); + if (!m_Timer.ContainsKey(m_Scene)) + m_Timer[m_Scene] = new Timer(this); + if (!m_HttpRequest.ContainsKey(m_Scene)) + m_HttpRequest[m_Scene] = new HttpRequest(this); + if (!m_Listener.ContainsKey(m_Scene)) + m_Listener[m_Scene] = new Listener(this); + if (!m_SensorRepeat.ContainsKey(m_Scene)) + m_SensorRepeat[m_Scene] = new SensorRepeat(this); + if (!m_XmlRequest.ContainsKey(m_Scene)) + m_XmlRequest[m_Scene] = new XmlRequest(this); StartThread(); } @@ -127,26 +147,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void ReadConfig() { - cmdHandlerThreadCycleSleepms = m_ScriptEngine.Config.GetInt("AsyncLLCommandLoopms", 100); +// cmdHandlerThreadCycleSleepms = m_ScriptEngine.Config.GetInt("AsyncLLCommandLoopms", 100); + // TODO: Make this sane again + cmdHandlerThreadCycleSleepms = 100; } ~AsyncCommandManager() { // Shut down thread - try - { - if (cmdHandlerThread != null) - { - if (cmdHandlerThread.IsAlive == true) - { - cmdHandlerThread.Abort(); - //cmdHandlerThread.Join(); - } - } - } - catch - { - } +// try +// { +// if (cmdHandlerThread != null) +// { +// if (cmdHandlerThread.IsAlive == true) +// { +// cmdHandlerThread.Abort(); +// //cmdHandlerThread.Join(); +// } +// } +// } +// catch +// { +// } } /// @@ -162,10 +184,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { Thread.Sleep(cmdHandlerThreadCycleSleepms); - foreach (AsyncCommandManager m in m_Managers) - { - m.DoOneCmdHandlerPass(); - } + DoOneCmdHandlerPass(); } } catch @@ -174,20 +193,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } - public void DoOneCmdHandlerPass() + private static void DoOneCmdHandlerPass() { - // Check timers - m_Timer.CheckTimerEvents(); - // Check HttpRequests - m_HttpRequest.CheckHttpRequests(); - // Check XMLRPCRequests - m_XmlRequest.CheckXMLRPCRequests(); - // Check Listeners - m_Listener.CheckListeners(); - // Check Sensors - m_SensorRepeat.CheckSenseRepeaterEvents(); - // Check dataserver - m_Dataserver.ExpireRequests(); + foreach (IScene s in m_Scenes) + { + // Check timers + m_Timer[s].CheckTimerEvents(); + // Check HttpRequests + m_HttpRequest[s].CheckHttpRequests(); + // Check XMLRPCRequests + m_XmlRequest[s].CheckXMLRPCRequests(); + // Check Listeners + m_Listener[s].CheckListeners(); + // Check Sensors + m_SensorRepeat[s].CheckSenseRepeaterEvents(); + // Check dataserver + m_Dataserver[s].ExpireRequests(); + } } /// @@ -195,38 +217,38 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// /// /// - public void RemoveScript(uint localID, UUID itemID) + public static void RemoveScript(IScene scene, uint localID, UUID itemID) { // Remove a specific script // Remove dataserver events - m_Dataserver.RemoveEvents(localID, itemID); + m_Dataserver[scene].RemoveEvents(localID, itemID); // Remove from: Timers - m_Timer.UnSetTimerEvents(localID, itemID); + m_Timer[scene].UnSetTimerEvents(localID, itemID); // Remove from: HttpRequest IHttpRequests iHttpReq = - m_ScriptEngine.World.RequestModuleInterface(); + scene.RequestModuleInterface(); iHttpReq.StopHttpRequest(localID, itemID); - IWorldComm comms = m_ScriptEngine.World.RequestModuleInterface(); + IWorldComm comms = scene.RequestModuleInterface(); comms.DeleteListener(itemID); - IXMLRPC xmlrpc = m_ScriptEngine.World.RequestModuleInterface(); + IXMLRPC xmlrpc = scene.RequestModuleInterface(); xmlrpc.DeleteChannels(itemID); xmlrpc.CancelSRDRequests(itemID); // Remove Sensors - m_SensorRepeat.UnSetSenseRepeaterEvents(localID, itemID); + m_SensorRepeat[scene].UnSetSenseRepeaterEvents(localID, itemID); } - public Object[] GetSerializationData(UUID itemID) + public static Object[] GetSerializationData(IScene scene, UUID itemID) { List data = new List(); - Object[] listeners=m_Listener.GetSerializationData(itemID); + Object[] listeners=m_Listener[scene].GetSerializationData(itemID); if (listeners.Length > 0) { data.Add("listener"); @@ -234,7 +256,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api data.AddRange(listeners); } - Object[] timers=m_Timer.GetSerializationData(itemID); + Object[] timers=m_Timer[scene].GetSerializationData(itemID); if (timers.Length > 0) { data.Add("timer"); @@ -242,7 +264,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api data.AddRange(timers); } - Object[] sensors=m_SensorRepeat.GetSerializationData(itemID); + Object[] sensors=m_SensorRepeat[scene].GetSerializationData(itemID); if (sensors.Length > 0) { data.Add("sensor"); @@ -253,8 +275,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return data.ToArray(); } - public void CreateFromData(uint localID, UUID itemID, UUID hostID, - Object[] data) + public static void CreateFromData(IScene scene, uint localID, + UUID itemID, UUID hostID, Object[] data) { int idx = 0; int len; @@ -275,15 +297,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api switch (type) { case "listener": - m_Listener.CreateFromData(localID, itemID, hostID, - item); + m_Listener[scene].CreateFromData(localID, itemID, + hostID, item); break; case "timer": - m_Timer.CreateFromData(localID, itemID, hostID, item); + m_Timer[scene].CreateFromData(localID, itemID, + hostID, item); break; case "sensor": - m_SensorRepeat.CreateFromData(localID, itemID, hostID, - item); + m_SensorRepeat[scene].CreateFromData(localID, + itemID, hostID, item); break; } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 512fcd9..552d47c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -92,7 +92,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_ScriptDistanceFactor = config.Configs["XEngine"]. GetFloat("ScriptDistanceLimitFactor", 1.0f); - AsyncCommands = (AsyncCommandManager)ScriptEngine.AsyncCommands; + AsyncCommands = new AsyncCommandManager(ScriptEngine); } private DateTime m_timer = DateTime.Now; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/HttpRequest.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/HttpRequest.cs index 92f603d..3d3fb05 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/HttpRequest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/HttpRequest.cs @@ -77,9 +77,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins new LSL_Types.LSLString(httpInfo.response_body) }; - foreach (AsyncCommandManager m in m_CmdManager.Managers) + foreach (IScriptEngine e in m_CmdManager.ScriptEngines) { - if (m.m_ScriptEngine.PostObjectEvent(httpInfo.localID, + if (e.PostObjectEvent(httpInfo.localID, new EventParams("http_response", resobj, new DetectParams[0]))) break; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/XmlRequest.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/XmlRequest.cs index 3f3cf39..a7699a1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/XmlRequest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/XmlRequest.cs @@ -71,9 +71,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins new LSL_Types.LSLString(rInfo.GetStrVal()) }; - foreach (AsyncCommandManager m in m_CmdManager.Managers) + foreach (IScriptEngine e in m_CmdManager.ScriptEngines) { - if (m.m_ScriptEngine.PostScriptEvent( + if (e.PostScriptEvent( rInfo.GetItemID(), new EventParams( "remote_data", resobj, new DetectParams[0]))) @@ -100,9 +100,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins new LSL_Types.LSLString(srdInfo.sdata) }; - foreach (AsyncCommandManager m in m_CmdManager.Managers) + foreach (IScriptEngine e in m_CmdManager.ScriptEngines) { - if (m.m_ScriptEngine.PostScriptEvent( + if (e.PostScriptEvent( srdInfo.m_itemID, new EventParams( "remote_data", resobj, new DetectParams[0]))) -- cgit v1.1