From eb01597dd3020ab3f32ea5a26f7df03d935f871a Mon Sep 17 00:00:00 2001 From: NotAlwaysTrue <2136846186@qq.com> Date: Tue, 23 Dec 2025 22:32:35 +0800 Subject: [PATCH] Try-catch Sever Entity Event Manager thread-safety issue --- .../ServerEntityEventManager.cs | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/Barotrauma/BarotraumaServer/ServerSource/Networking/NetEntityEvent/ServerEntityEventManager.cs b/Barotrauma/BarotraumaServer/ServerSource/Networking/NetEntityEvent/ServerEntityEventManager.cs index 283eeb789..d74b71a55 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/Networking/NetEntityEvent/ServerEntityEventManager.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/Networking/NetEntityEvent/ServerEntityEventManager.cs @@ -238,6 +238,7 @@ namespace Barotrauma.Networking } } + // Due to intensive access demend and time it takes to refactor, we use try-catch when facing thread-safety issue to skip to next update :( public void Update(List clients) { foreach (BufferedEvent bufferedEvent in bufferedEvents) @@ -324,7 +325,16 @@ namespace Barotrauma.Networking lastSentToAnyone = c.LastRecvEntityEventID; } } - lastSentToAnyoneTime = events.Find(e => e.ID == lastSentToAnyone)?.CreateTime ?? Timing.TotalTime; + + try + { + lastSentToAnyoneTime = events.ToList().Find(e => e.ID == lastSentToAnyone)?.CreateTime ?? Timing.TotalTime; + } + catch + { + lastSentToAnyoneTime = Timing.TotalTime; + } + if (Timing.TotalTime - lastWarningTime > 5.0 && Timing.TotalTime - lastSentToAnyoneTime > 10.0 && @@ -340,7 +350,16 @@ namespace Barotrauma.Networking clients.Where(c => c.NeedsMidRoundSync).ForEach(c => { if (NetIdUtils.IdMoreRecent(lastSentToAll, c.FirstNewEventID)) lastSentToAll = (ushort)(c.FirstNewEventID - 1); }); - ServerEntityEvent firstEventToResend = events.Find(e => e.ID == (ushort)(lastSentToAll + 1)); + ServerEntityEvent firstEventToResend; + try + { + firstEventToResend = events.Find(e => e.ID == (ushort)(lastSentToAll + 1)); + } + catch + { + firstEventToResend = null; + } + if (firstEventToResend != null && GameMain.GameSession.RoundDuration > server.ServerSettings.RoundStartSyncDuration && ((lastSentToAnyoneTime - firstEventToResend.CreateTime) > server.ServerSettings.OldReceivedEventKickTime || (Timing.TotalTime - firstEventToResend.CreateTime) > server.ServerSettings.OldEventKickTime))