From 60868fe9750a44128fd5863dbc59f0d1084c15ab Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 11 Mar 2021 23:54:34 +0000 Subject: [PATCH] vs2017 debug seems to get very confused with our script class called Timer (run runprebuild) --- .../Interfaces/IScriptInstance.cs | 2 +- .../Api/Implementation/AsyncCommandManager.cs | 40 ++-- .../Api/Implementation/Plugins/Timer.cs | 206 ------------------ .../Shared/Instance/ScriptInstance.cs | 15 +- .../XEngine/ScriptEngineConsoleCommands.cs | 6 +- .../Region/ScriptEngine/XEngine/XEngine.cs | 44 ++-- 6 files changed, 51 insertions(+), 262 deletions(-) delete mode 100644 OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs index 40c2fd2cc9..6f422bd455 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs @@ -201,7 +201,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces /// Process the next event queued for this script instance. /// /// - object EventProcessor(); + void EventProcessor(); int EventTime(); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs index 2ccad2eff5..4969e33673 100755 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs @@ -36,7 +36,7 @@ using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.ScriptEngine.Interfaces; using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; -using Timer=OpenSim.Region.ScriptEngine.Shared.Api.Plugins.Timer; +using ScriptTimer=OpenSim.Region.ScriptEngine.Shared.Api.Plugins.ScriptTimer; using System.Reflection; using log4net; @@ -68,8 +68,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api private static Dictionary m_Dataserver = new Dictionary(); - private static Dictionary m_Timer = - new Dictionary(); + private static Dictionary m_ScriptTimer = + new Dictionary(); private static Dictionary m_Listener = new Dictionary(); private static Dictionary m_HttpRequest = @@ -88,12 +88,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } - public Timer TimerPlugin + public ScriptTimer TimerPlugin { get { lock (staticLock) - return m_Timer[m_ScriptEngine]; + return m_ScriptTimer[m_ScriptEngine]; } } @@ -161,8 +161,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // Create instances of all plugins if (!m_Dataserver.ContainsKey(m_ScriptEngine)) m_Dataserver[m_ScriptEngine] = new Dataserver(this); - if (!m_Timer.ContainsKey(m_ScriptEngine)) - m_Timer[m_ScriptEngine] = new Timer(this); + if (!m_ScriptTimer.ContainsKey(m_ScriptEngine)) + m_ScriptTimer[m_ScriptEngine] = new ScriptTimer(this); if (!m_HttpRequest.ContainsKey(m_ScriptEngine)) m_HttpRequest[m_ScriptEngine] = new HttpRequest(this); if (!m_Listener.ContainsKey(m_ScriptEngine)) @@ -258,8 +258,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // Check Listeners try { m_Listener[s].CheckListeners(); } catch {} - // Check timers - try { m_Timer[s].CheckTimerEvents(); } catch {} + // Check ScriptTimers + try { m_ScriptTimer[s].CheckTimerEvents(); } catch {} // Check Sensors try { m_SensorRepeat[s].CheckSenseRepeaterEvents(); } catch {} @@ -285,8 +285,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // Remove dataserver events m_Dataserver[engine].RemoveEvents(localID, itemID); - // Remove from: Timers - m_Timer[engine].UnSetTimerEvents(localID, itemID); + // Remove from: ScriptTimers + m_ScriptTimer[engine].UnSetTimerEvents(localID, itemID); if(engine.World != null) { @@ -366,16 +366,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } /// - /// Get the timer plugin for this script engine. + /// Get the ScriptTimer plugin for this script engine. /// /// /// - public static Timer GetTimerPlugin(IScriptEngine engine) + public static ScriptTimer GetTimerPlugin(IScriptEngine engine) { lock (staticLock) { - if (m_Timer.ContainsKey(engine)) - return m_Timer[engine]; + if (m_ScriptTimer.ContainsKey(engine)) + return m_ScriptTimer[engine]; else return null; } @@ -411,12 +411,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api data.AddRange(listeners); } - Object[] timers=m_Timer[engine].GetSerializationData(itemID); - if (timers.Length > 0) + Object[] ScriptTimers=m_ScriptTimer[engine].GetSerializationData(itemID); + if (ScriptTimers.Length > 0) { data.Add("timer"); - data.Add(timers.Length); - data.AddRange(timers); + data.Add(ScriptTimers.Length); + data.AddRange(ScriptTimers); } Object[] sensors = m_SensorRepeat[engine].GetSerializationData(itemID); @@ -459,7 +459,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api hostID, item); break; case "timer": - m_Timer[engine].CreateFromData(localID, itemID, + m_ScriptTimer[engine].CreateFromData(localID, itemID, hostID, item); break; case "sensor": diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs deleted file mode 100644 index f8dea98eea..0000000000 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections; -using System.Collections.Generic; -using OpenMetaverse; -using OpenSim.Region.ScriptEngine.Shared.Api; - -namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins -{ - public class Timer - { - public class TimerInfo - { - public uint localID; - public UUID itemID; - //public double interval; - public long interval; - //public DateTime next; - public long next; - - public TimerInfo Clone() - { - return (TimerInfo)this.MemberwiseClone(); - } - } - - public AsyncCommandManager m_CmdManager; - - public int TimersCount - { - get - { - lock (TimerListLock) - return Timers.Count; - } - } - - public Timer(AsyncCommandManager CmdManager) - { - m_CmdManager = CmdManager; - } - - // - // TIMER - // - static private string MakeTimerKey(uint localID, UUID itemID) - { - return localID.ToString() + itemID.ToString(); - } - - private Dictionary Timers = new Dictionary(); - private object TimerListLock = new object(); - - public void SetTimerEvent(uint m_localID, UUID m_itemID, double sec) - { - if (sec == 0) // Disabling timer - { - UnSetTimerEvents(m_localID, m_itemID); - return; - } - - // Add to timer - TimerInfo ts = new TimerInfo(); - ts.localID = m_localID; - ts.itemID = m_itemID; - ts.interval = Convert.ToInt64(sec * 10000000); // How many 100 nanoseconds (ticks) should we wait - // 2193386136332921 ticks - // 219338613 seconds - - //ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); - ts.next = DateTime.Now.Ticks + ts.interval; - - string key = MakeTimerKey(m_localID, m_itemID); - lock (TimerListLock) - { - // Adds if timer doesn't exist, otherwise replaces with new timer - Timers[key] = ts; - } - } - - public void UnSetTimerEvents(uint m_localID, UUID m_itemID) - { - // Remove from timer - string key = MakeTimerKey(m_localID, m_itemID); - lock (TimerListLock) - { - if (Timers.TryGetValue(key, out TimerInfo ts)) - { - m_CmdManager.m_ScriptEngine.CancelScriptEvent(ts.itemID, "timer"); - Timers.Remove(key); - } - } - } - - public void CheckTimerEvents() - { - // Nothing to do here? - if (Timers.Count == 0) - return; - - Dictionary tvals; - lock (TimerListLock) - { - // Go through all timers - tvals = new Dictionary(Timers); - } - - foreach (TimerInfo ts in tvals.Values) - { - // Time has passed? - if (ts.next < DateTime.Now.Ticks) - { - //m_log.Debug("Time has passed: Now: " + DateTime.Now.Ticks + ", Passed: " + ts.next); - // Add it to queue - m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, - new EventParams("timer", new Object[0], - new DetectParams[0])); - // set next interval - - //ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); - ts.next = DateTime.Now.Ticks + ts.interval; - } - } - } - - public Object[] GetSerializationData(UUID itemID) - { - List data = new List(); - - lock (TimerListLock) - { - Dictionary.ValueCollection tvals = Timers.Values; - foreach (TimerInfo ts in tvals) - { - if (ts.itemID == itemID) - { - data.Add(ts.interval); - data.Add(ts.next-DateTime.Now.Ticks); - } - } - } - return data.ToArray(); - } - - public void CreateFromData(uint localID, UUID itemID, UUID objectID, - Object[] data) - { - int idx = 0; - - while (idx < data.Length) - { - TimerInfo ts = new TimerInfo(); - - ts.localID = localID; - ts.itemID = itemID; - ts.interval = (long)data[idx]; - ts.next = DateTime.Now.Ticks + (long)data[idx+1]; - idx += 2; - - lock (TimerListLock) - { - Timers.Add(MakeTimerKey(localID, itemID), ts); - } - } - } - - public List GetTimersInfo() - { - List retList = new List(); - - lock (TimerListLock) - { - foreach (TimerInfo i in Timers.Values) - retList.Add(i.Clone()); - } - - return retList; - } - } -} diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 1397ca5210..9ed0cca9d4 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -783,24 +783,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance /// Process the next event queued for this script /// /// - public object EventProcessor() + public void EventProcessor() { // We check here as the thread stopping this instance from running may itself hold the m_Script lock. if (!Running) - return 0; + return; lock (m_Script) { // m_log.DebugFormat("[XEngine]: EventProcessor() invoked for {0}.{1}", PrimName, ScriptName); if (Suspended) - return 0; + return; ExecutionTimer.Restart(); try { - return EventProcessorInt(); + EventProcessorInt(); + return; } finally { @@ -811,7 +812,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance } } - private object EventProcessorInt() + private void EventProcessorInt() { EventParams data = null; @@ -829,7 +830,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance { m_CurrentWorkItem = null; } - return 0; + return; } if (data.EventName == "timer") @@ -1052,8 +1053,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance } m_DetectParams = null; - - return 0; } public int EventTime() diff --git a/OpenSim/Region/ScriptEngine/XEngine/ScriptEngineConsoleCommands.cs b/OpenSim/Region/ScriptEngine/XEngine/ScriptEngineConsoleCommands.cs index d756f59f60..564bf37baf 100755 --- a/OpenSim/Region/ScriptEngine/XEngine/ScriptEngineConsoleCommands.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/ScriptEngineConsoleCommands.cs @@ -97,7 +97,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine if (!IsSceneSelected()) return; - Timer timerPlugin = AsyncCommandManager.GetTimerPlugin(m_engine); + ScriptTimer timerPlugin = AsyncCommandManager.GetTimerPlugin(m_engine); if (timerPlugin == null) { @@ -105,7 +105,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine return; } - List timersInfo = timerPlugin.GetTimersInfo(); + List timersInfo = timerPlugin.GetTimersInfo(); ConsoleDisplayTable cdt = new ConsoleDisplayTable(); cdt.AddColumn("Part local ID", 13); @@ -113,7 +113,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine cdt.AddColumn("Interval", 10); cdt.AddColumn("Next", 8); - foreach (Timer.TimerInfo t in timersInfo) + foreach (ScriptTimer.TimerInfo t in timersInfo) { // Convert from 100 ns ticks back to seconds cdt.AddRow(t.localID, t.itemID, (double)t.interval / 10000000, t.next); diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 28c23373cf..fc5719ad79 100755 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -55,7 +55,7 @@ using OpenSim.Region.ScriptEngine.Shared.Api; using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; using OpenSim.Region.ScriptEngine.Shared.ScriptBase; using OpenSim.Region.ScriptEngine.XEngine.ScriptBase; -using Timer = OpenSim.Region.ScriptEngine.Shared.Api.Plugins.Timer; +using ScritTimer = OpenSim.Region.ScriptEngine.Shared.Api.Plugins.ScriptTimer; using ScriptCompileQueue = OpenSim.Framework.LocklessQueue; @@ -599,7 +599,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine Dataserver ds = AsyncCommandManager.GetDataserverPlugin(this); sb.AppendFormat("Dataserver requests : {0}\n", ds != null ? ds.DataserverRequestsCount : 0); - Timer t = AsyncCommandManager.GetTimerPlugin(this); + ScritTimer t = AsyncCommandManager.GetTimerPlugin(this); sb.AppendFormat("Timers : {0}\n", t != null ? t.TimersCount : 0); Listener l = AsyncCommandManager.GetListenerPlugin(this); @@ -801,14 +801,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine if (m_SleepTime > 0) { - m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoMaintenance), - new Object[]{ m_SleepTime }); + m_ThreadPool.QueueWorkItem(DoMaintenance, new object[]{ m_SleepTime }); } if (m_SaveTime > 0) { - m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoBackup), - new Object[] { m_SaveTime }); + m_ThreadPool.QueueWorkItem(DoBackup, new object[] { m_SaveTime }); } } @@ -876,8 +874,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine } if (saveTime > 0) - m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoBackup), - new Object[] { saveTime }); + m_ThreadPool.QueueWorkItem(DoBackup, new object[] { saveTime }); return 0; } @@ -904,8 +901,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine System.Threading.Thread.Sleep(sleepTime); - m_ThreadPool.QueueWorkItem(new WorkItemCallback(this.DoMaintenance), - new Object[]{ sleepTime }); + m_ThreadPool.QueueWorkItem(DoMaintenance, new object[]{ sleepTime }); return 0; } @@ -1690,15 +1686,17 @@ namespace OpenSim.Region.ScriptEngine.XEngine { m_MaxScriptQueue = maxScriptQueue; - STPStartInfo startInfo = new STPStartInfo(); - startInfo.ThreadPoolName = "XEngine"; - startInfo.IdleTimeout = idleTimeout * 1000; // convert to seconds as stated in .ini - startInfo.MaxWorkerThreads = maxThreads; - startInfo.MinWorkerThreads = minThreads; - startInfo.ThreadPriority = threadPriority;; - startInfo.MaxStackSize = stackSize; - startInfo.StartSuspended = true; - + STPStartInfo startInfo = new STPStartInfo() + { + ThreadPoolName = "XEngine", + IdleTimeout = idleTimeout * 1000, // convert to seconds as stated in .ini + MaxWorkerThreads = maxThreads, + MinWorkerThreads = minThreads, + ThreadPriority = threadPriority, + MaxStackSize = stackSize, + SuppressFlow = true, + StartSuspended = true + }; m_ThreadPool = new SmartThreadPool(startInfo); } @@ -1707,9 +1705,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine // public IScriptWorkItem QueueEventHandler(object parms) { - return new XWorkItem(m_ThreadPool.QueueWorkItem( - new WorkItemCallback(this.ProcessEventHandler), - parms)); + return new XWorkItem(m_ThreadPool.QueueWorkItem((WaitCallback)ProcessEventHandler,parms)); } /// @@ -1717,7 +1713,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine /// /// /// - private object ProcessEventHandler(object parms) + private void ProcessEventHandler(object parms) { Culture.SetCurrentCulture(); @@ -1725,7 +1721,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine // m_log.DebugFormat("[XEngine]: Processing event for {0}", instance); - return instance.EventProcessor(); + instance.EventProcessor(); } ///