From d24486937728ad362acda949c4f7d9a25a0ea244 Mon Sep 17 00:00:00 2001 From: Cintique Date: Fri, 6 May 2022 15:43:17 +1000 Subject: [PATCH 1/4] Fix blocking issue in `LuaCsTimer` Logic for scheduling actions in `LuaCsHook` (see `Enqueue()` and `Update()`) caused tasks with long delays to block the execution of tasks with shorter delays. Moved logic for `Timer.Wait()` from `LuaCsHook` to `LuaCsTimer` and corrected the blocking issue. --- .../SharedSource/LuaCs/LuaCsSetup.cs | 2 + .../SharedSource/LuaCs/LuaCsUtility.cs | 103 ++++++++++++++---- 2 files changed, 83 insertions(+), 22 deletions(-) diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs index 965cfeec8..212f4b56b 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs @@ -297,6 +297,7 @@ namespace Barotrauma public void Update() { Hook?.Update(); + LuaCsTimer.Update(); } public void Stop() @@ -312,6 +313,7 @@ namespace Barotrauma if (Thread.CurrentThread == GameMain.MainThread) { Hook?.Call("stop"); + LuaCsTimer.Clear(); } Game?.Stop(); diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsUtility.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsUtility.cs index 0b9a53ada..d2c35bf52 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsUtility.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsUtility.cs @@ -13,28 +13,12 @@ using System.Xml.Linq; namespace Barotrauma { - public partial class LuaCsTimer - { - public static long LastUpdateTime = 0; - - public static double Time - { - get - { - return GetTime(); - } - } - - public static void Wait(LuaCsAction action, int millisecondDelay) - { - GameMain.LuaCs.Hook.EnqueueTimed((float)Timing.TotalTime + (millisecondDelay / 1000f), action); - } - - public static double GetTime() - { - return Timing.TotalTime; - } + public class LuaCsTimer + { + public static long LastUpdateTime = 0; + public static double Time => Timing.TotalTime; + public static float GetUsageMemory() { Process proc = Process.GetCurrentProcess(); @@ -43,7 +27,82 @@ namespace Barotrauma return memory; } - } + + private class TimerComparer : IComparer + { + public int Compare(TimedAction timedAction1, TimedAction timedAction2) + { + if (timedAction1 == null || timedAction2 == null) + return 0; + return -Math.Sign(timedAction2.executionTime - timedAction1.executionTime); + } + } + + private class TimedAction + { + public LuaCsAction action + { + get; + private set; + } + + private int delayMs; + + public double executionTime + { + get; + private set; + } + public TimedAction(LuaCsAction action, int delayMs) + { + this.action = action; + this.delayMs = delayMs; + executionTime = Time + (delayMs / 1000f); + } + } + + private static List timedActions = new List(); + + private static void AddTimer(TimedAction timedAction) + { + int insertionPoint = timedActions.BinarySearch(timedAction, new TimerComparer()); + + if (insertionPoint < 0) + { + insertionPoint = ~insertionPoint; + } + + timedActions.Insert(insertionPoint, timedAction); + } + + public static void Update() + { + while (timedActions.Count > 0) + { + TimedAction timedAction = timedActions[0]; + if (Time >= timedAction.executionTime) + { + timedAction.action(); + timedActions.RemoveAt(0); + } + else + { + break; + } + } + } + + public static void Clear() + { + timedActions = new List(); + } + + public static void Wait(LuaCsAction action, int millisecondDelay) + { + TimedAction timedAction = new TimedAction(action, millisecondDelay); + AddTimer(timedAction); + } + } partial class LuaCsFile { From 5aef20aae28ee21ddee5eefb96d5d0864512c006 Mon Sep 17 00:00:00 2001 From: Cintique Date: Fri, 6 May 2022 15:46:22 +1000 Subject: [PATCH 2/4] Move `LuaCsTimer` to its own file. --- .../SharedSource/LuaCs/LuaCsTimer.cs | 97 +++++++++++++++++++ .../SharedSource/LuaCs/LuaCsUtility.cs | 91 ----------------- 2 files changed, 97 insertions(+), 91 deletions(-) create mode 100644 Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs new file mode 100644 index 000000000..7903755d8 --- /dev/null +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; + +namespace Barotrauma +{ + public class LuaCsTimer + { + public static long LastUpdateTime = 0; + + public static double Time => Timing.TotalTime; + + public static float GetUsageMemory() + { + Process proc = Process.GetCurrentProcess(); + float memory = MathF.Round(proc.PrivateMemorySize64 / (1024 * 1024), 2); + proc.Dispose(); + + return memory; + } + + private class TimerComparer : IComparer + { + public int Compare(TimedAction timedAction1, TimedAction timedAction2) + { + if (timedAction1 == null || timedAction2 == null) + return 0; + return -Math.Sign(timedAction2.executionTime - timedAction1.executionTime); + } + } + + private class TimedAction + { + public LuaCsAction action + { + get; + private set; + } + + private int delayMs; + + public double executionTime + { + get; + private set; + } + public TimedAction(LuaCsAction action, int delayMs) + { + this.action = action; + this.delayMs = delayMs; + executionTime = Time + (delayMs / 1000f); + } + } + + private static List timedActions = new List(); + + private static void AddTimer(TimedAction timedAction) + { + int insertionPoint = timedActions.BinarySearch(timedAction, new TimerComparer()); + + if (insertionPoint < 0) + { + insertionPoint = ~insertionPoint; + } + + timedActions.Insert(insertionPoint, timedAction); + } + + public static void Update() + { + while (timedActions.Count > 0) + { + TimedAction timedAction = timedActions[0]; + if (Time >= timedAction.executionTime) + { + timedAction.action(); + timedActions.RemoveAt(0); + } + else + { + break; + } + } + } + + public static void Clear() + { + timedActions = new List(); + } + + public static void Wait(LuaCsAction action, int millisecondDelay) + { + TimedAction timedAction = new TimedAction(action, millisecondDelay); + AddTimer(timedAction); + } + } +} \ No newline at end of file diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsUtility.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsUtility.cs index d2c35bf52..0014ba84e 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsUtility.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsUtility.cs @@ -13,97 +13,6 @@ using System.Xml.Linq; namespace Barotrauma { - public class LuaCsTimer - { - public static long LastUpdateTime = 0; - - public static double Time => Timing.TotalTime; - - public static float GetUsageMemory() - { - Process proc = Process.GetCurrentProcess(); - float memory = MathF.Round(proc.PrivateMemorySize64 / (1024 * 1024), 2); - proc.Dispose(); - - return memory; - } - - private class TimerComparer : IComparer - { - public int Compare(TimedAction timedAction1, TimedAction timedAction2) - { - if (timedAction1 == null || timedAction2 == null) - return 0; - return -Math.Sign(timedAction2.executionTime - timedAction1.executionTime); - } - } - - private class TimedAction - { - public LuaCsAction action - { - get; - private set; - } - - private int delayMs; - - public double executionTime - { - get; - private set; - } - public TimedAction(LuaCsAction action, int delayMs) - { - this.action = action; - this.delayMs = delayMs; - executionTime = Time + (delayMs / 1000f); - } - } - - private static List timedActions = new List(); - - private static void AddTimer(TimedAction timedAction) - { - int insertionPoint = timedActions.BinarySearch(timedAction, new TimerComparer()); - - if (insertionPoint < 0) - { - insertionPoint = ~insertionPoint; - } - - timedActions.Insert(insertionPoint, timedAction); - } - - public static void Update() - { - while (timedActions.Count > 0) - { - TimedAction timedAction = timedActions[0]; - if (Time >= timedAction.executionTime) - { - timedAction.action(); - timedActions.RemoveAt(0); - } - else - { - break; - } - } - } - - public static void Clear() - { - timedActions = new List(); - } - - public static void Wait(LuaCsAction action, int millisecondDelay) - { - TimedAction timedAction = new TimedAction(action, millisecondDelay); - AddTimer(timedAction); - } - } - partial class LuaCsFile { public static bool CanReadFromPath(string path) From 726399a87d21e975d4f9a9d7dfbc8fec18f8050e Mon Sep 17 00:00:00 2001 From: Cintique Date: Fri, 6 May 2022 19:20:20 +1000 Subject: [PATCH 3/4] Fix formatting --- .../SharedSource/LuaCs/LuaCsTimer.cs | 159 +++++++++--------- 1 file changed, 80 insertions(+), 79 deletions(-) diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs index 7903755d8..5c0cae3bc 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs @@ -5,93 +5,94 @@ using System.Diagnostics; namespace Barotrauma { public class LuaCsTimer - { - public static long LastUpdateTime = 0; - - public static double Time => Timing.TotalTime; + { + public static long LastUpdateTime = 0; + + public static double Time => Timing.TotalTime; + + public static float GetUsageMemory() + { + Process proc = Process.GetCurrentProcess(); + float memory = MathF.Round(proc.PrivateMemorySize64 / (1024 * 1024), 2); + proc.Dispose(); + + return memory; + } + + private class TimerComparer : IComparer + { + public int Compare(TimedAction timedAction1, TimedAction timedAction2) + { + if (timedAction1 == null || timedAction2 == null) + return 0; + return -Math.Sign(timedAction2.executionTime - timedAction1.executionTime); + } + } + + private class TimedAction + { + public LuaCsAction action + { + get; + private set; + } + + private int delayMs; + + public double executionTime + { + get; + private set; + } + + public TimedAction(LuaCsAction action, int delayMs) + { + this.action = action; + this.delayMs = delayMs; + executionTime = Time + (delayMs / 1000f); + } + } + + private static List timedActions = new List(); + + private static void AddTimer(TimedAction timedAction) + { + int insertionPoint = timedActions.BinarySearch(timedAction, new TimerComparer()); - public static float GetUsageMemory() + if (insertionPoint < 0) { - Process proc = Process.GetCurrentProcess(); - float memory = MathF.Round(proc.PrivateMemorySize64 / (1024 * 1024), 2); - proc.Dispose(); - - return memory; - } - - private class TimerComparer : IComparer - { - public int Compare(TimedAction timedAction1, TimedAction timedAction2) - { - if (timedAction1 == null || timedAction2 == null) - return 0; - return -Math.Sign(timedAction2.executionTime - timedAction1.executionTime); - } - } - - private class TimedAction - { - public LuaCsAction action - { - get; - private set; - } - - private int delayMs; - - public double executionTime - { - get; - private set; - } - public TimedAction(LuaCsAction action, int delayMs) - { - this.action = action; - this.delayMs = delayMs; - executionTime = Time + (delayMs / 1000f); - } + insertionPoint = ~insertionPoint; } - private static List timedActions = new List(); - - private static void AddTimer(TimedAction timedAction) + timedActions.Insert(insertionPoint, timedAction); + } + + public static void Update() + { + while (timedActions.Count > 0) { - int insertionPoint = timedActions.BinarySearch(timedAction, new TimerComparer()); - - if (insertionPoint < 0) + TimedAction timedAction = timedActions[0]; + if (Time >= timedAction.executionTime) { - insertionPoint = ~insertionPoint; + timedAction.action(); + timedActions.RemoveAt(0); } - - timedActions.Insert(insertionPoint, timedAction); - } - - public static void Update() - { - while (timedActions.Count > 0) + else { - TimedAction timedAction = timedActions[0]; - if (Time >= timedAction.executionTime) - { - timedAction.action(); - timedActions.RemoveAt(0); - } - else - { - break; - } + break; } } - - public static void Clear() - { - timedActions = new List(); - } - - public static void Wait(LuaCsAction action, int millisecondDelay) - { - TimedAction timedAction = new TimedAction(action, millisecondDelay); - AddTimer(timedAction); - } - } + } + + public static void Clear() + { + timedActions = new List(); + } + + public static void Wait(LuaCsAction action, int millisecondDelay) + { + TimedAction timedAction = new TimedAction(action, millisecondDelay); + AddTimer(timedAction); + } + } } \ No newline at end of file From 1484c75595c13ce18b5ea452e3e41e983c180759 Mon Sep 17 00:00:00 2001 From: Cintique Date: Fri, 6 May 2022 19:21:12 +1000 Subject: [PATCH 4/4] Fix indents --- .../SharedSource/LuaCs/LuaCsTimer.cs | 152 +++++++++--------- 1 file changed, 76 insertions(+), 76 deletions(-) diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs index 5c0cae3bc..4682544c0 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsTimer.cs @@ -8,91 +8,91 @@ namespace Barotrauma { public static long LastUpdateTime = 0; - public static double Time => Timing.TotalTime; - - public static float GetUsageMemory() - { - Process proc = Process.GetCurrentProcess(); - float memory = MathF.Round(proc.PrivateMemorySize64 / (1024 * 1024), 2); - proc.Dispose(); + public static double Time => Timing.TotalTime; + + public static float GetUsageMemory() + { + Process proc = Process.GetCurrentProcess(); + float memory = MathF.Round(proc.PrivateMemorySize64 / (1024 * 1024), 2); + proc.Dispose(); - return memory; - } + return memory; + } - private class TimerComparer : IComparer - { - public int Compare(TimedAction timedAction1, TimedAction timedAction2) - { - if (timedAction1 == null || timedAction2 == null) - return 0; - return -Math.Sign(timedAction2.executionTime - timedAction1.executionTime); - } - } + private class TimerComparer : IComparer + { + public int Compare(TimedAction timedAction1, TimedAction timedAction2) + { + if (timedAction1 == null || timedAction2 == null) + return 0; + return -Math.Sign(timedAction2.executionTime - timedAction1.executionTime); + } + } - private class TimedAction - { - public LuaCsAction action - { - get; - private set; - } + private class TimedAction + { + public LuaCsAction action + { + get; + private set; + } - private int delayMs; + private int delayMs; - public double executionTime - { - get; - private set; - } + public double executionTime + { + get; + private set; + } - public TimedAction(LuaCsAction action, int delayMs) - { - this.action = action; - this.delayMs = delayMs; - executionTime = Time + (delayMs / 1000f); - } - } - - private static List timedActions = new List(); + public TimedAction(LuaCsAction action, int delayMs) + { + this.action = action; + this.delayMs = delayMs; + executionTime = Time + (delayMs / 1000f); + } + } + + private static List timedActions = new List(); - private static void AddTimer(TimedAction timedAction) - { - int insertionPoint = timedActions.BinarySearch(timedAction, new TimerComparer()); - - if (insertionPoint < 0) - { - insertionPoint = ~insertionPoint; - } - - timedActions.Insert(insertionPoint, timedAction); - } + private static void AddTimer(TimedAction timedAction) + { + int insertionPoint = timedActions.BinarySearch(timedAction, new TimerComparer()); + + if (insertionPoint < 0) + { + insertionPoint = ~insertionPoint; + } + + timedActions.Insert(insertionPoint, timedAction); + } - public static void Update() - { - while (timedActions.Count > 0) - { - TimedAction timedAction = timedActions[0]; - if (Time >= timedAction.executionTime) - { - timedAction.action(); - timedActions.RemoveAt(0); - } - else - { - break; - } - } - } + public static void Update() + { + while (timedActions.Count > 0) + { + TimedAction timedAction = timedActions[0]; + if (Time >= timedAction.executionTime) + { + timedAction.action(); + timedActions.RemoveAt(0); + } + else + { + break; + } + } + } - public static void Clear() - { - timedActions = new List(); - } + public static void Clear() + { + timedActions = new List(); + } - public static void Wait(LuaCsAction action, int millisecondDelay) - { - TimedAction timedAction = new TimedAction(action, millisecondDelay); - AddTimer(timedAction); - } + public static void Wait(LuaCsAction action, int millisecondDelay) + { + TimedAction timedAction = new TimedAction(action, millisecondDelay); + AddTimer(timedAction); + } } } \ No newline at end of file