Fixed timer crash once for all - yes it was a race condition

This commit is contained in:
EvilFactory
2023-01-17 14:17:43 -03:00
parent 17d125e6d5
commit 2073cdf5e5
@@ -60,38 +60,44 @@ namespace Barotrauma
throw new ArgumentNullException(nameof(timedAction)); throw new ArgumentNullException(nameof(timedAction));
} }
int insertionPoint = timedActions.BinarySearch(timedAction, new TimerComparer()); lock (timedActions)
if (insertionPoint < 0)
{ {
insertionPoint = ~insertionPoint; int insertionPoint = timedActions.BinarySearch(timedAction, new TimerComparer());
}
timedActions.Insert(insertionPoint, timedAction); if (insertionPoint < 0)
{
insertionPoint = ~insertionPoint;
}
timedActions.Insert(insertionPoint, timedAction);
}
} }
public void Update() public void Update()
{ {
TimedAction[] timedCopy = timedActions.ToArray(); lock (timedActions)
for (int i = 0; i < timedCopy.Length; i++)
{ {
TimedAction timedAction = timedCopy[i]; TimedAction[] timedCopy = timedActions.ToArray();
if (Time >= timedAction.ExecutionTime) for (int i = 0; i < timedCopy.Length; i++)
{ {
try TimedAction timedAction = timedCopy[i];
if (Time >= timedAction.ExecutionTime)
{ {
timedAction.Action(); try
} {
catch (Exception e) timedAction.Action();
{ }
LuaCsLogger.HandleException(e, LuaCsMessageOrigin.CSharpMod); catch (Exception e)
} {
LuaCsLogger.HandleException(e, LuaCsMessageOrigin.CSharpMod);
}
timedActions.Remove(timedAction); timedActions.Remove(timedAction);
} }
else else
{ {
break; break;
}
} }
} }
} }