From 783e60f913b1ea2c9536ecbcae6295bdc90304d4 Mon Sep 17 00:00:00 2001 From: Anna Date: Sat, 21 Jan 2023 22:42:03 -0500 Subject: [PATCH] fix: try/finally all mutexes --- client/Messages.cs | 53 ++++++++++++++++--------- client/Pack.cs | 7 +++- client/Ui/MainWindowTabs/MessageList.cs | 20 +++++++--- 3 files changed, 54 insertions(+), 26 deletions(-) diff --git a/client/Messages.cs b/client/Messages.cs index fcddb1b..820449d 100644 --- a/client/Messages.cs +++ b/client/Messages.cs @@ -190,14 +190,16 @@ internal class Messages : IDisposable { var messages = JsonConvert.DeserializeObject(json)!; await this.CurrentMutex.WaitAsync(); - this.Current.Clear(); + try { + this.Current.Clear(); - foreach (var message in messages) { - this.Current[message.Id] = message; - this.SpawnQueue.Enqueue(message); + foreach (var message in messages) { + this.Current[message.Id] = message; + this.SpawnQueue.Enqueue(message); + } + } finally { + this.CurrentMutex.Release(); } - - this.CurrentMutex.Release(); } private void RemoveVfx(object? sender, EventArgs? e) { @@ -210,8 +212,11 @@ internal class Messages : IDisposable { internal void Clear() { this.CurrentMutex.Wait(); - this.Current.Clear(); - this.CurrentMutex.Release(); + try { + this.Current.Clear(); + } finally { + this.CurrentMutex.Release(); + } } internal IEnumerable Nearby() { @@ -221,27 +226,39 @@ internal class Messages : IDisposable { var position = player.Position; + List nearby; this.CurrentMutex.Wait(); - var nearby = this.Current - .Values - .Where(msg => Math.Abs(msg.Position.Y - position.Y) <= 1f) - .Where(msg => Vector3.Distance(msg.Position, position) <= 2f) - .ToList(); - this.CurrentMutex.Release(); + try { + nearby = this.Current + .Values + .Where(msg => Math.Abs(msg.Position.Y - position.Y) <= 1f) + .Where(msg => Vector3.Distance(msg.Position, position) <= 2f) + .ToList(); + } finally { + this.CurrentMutex.Release(); + } + return nearby; } internal void Add(Message message) { this.CurrentMutex.Wait(); - this.Current[message.Id] = message; - this.CurrentMutex.Release(); + try { + this.Current[message.Id] = message; + } finally { + this.CurrentMutex.Release(); + } + this.SpawnQueue.Enqueue(message); } internal void Remove(Guid id) { this.CurrentMutex.Wait(); - this.Current.Remove(id); - this.CurrentMutex.Release(); + try { + this.Current.Remove(id); + } finally { + this.CurrentMutex.Release(); + } } } diff --git a/client/Pack.cs b/client/Pack.cs index f273e34..56fbe62 100644 --- a/client/Pack.cs +++ b/client/Pack.cs @@ -20,8 +20,11 @@ public class Pack { var json = await resp.Content.ReadAsStringAsync(); var packs = JsonConvert.DeserializeObject(json)!; await AllMutex.WaitAsync(); - All = packs; - AllMutex.Release(); + try { + All = packs; + } finally { + AllMutex.Release(); + } }); } } diff --git a/client/Ui/MainWindowTabs/MessageList.cs b/client/Ui/MainWindowTabs/MessageList.cs index c961cc5..3e66742 100644 --- a/client/Ui/MainWindowTabs/MessageList.cs +++ b/client/Ui/MainWindowTabs/MessageList.cs @@ -41,7 +41,14 @@ internal class MessageList : ITab { } this.MessagesMutex.Wait(); + try { + this.ShowList(); + } finally { + this.MessagesMutex.Release(); + } + } + private void ShowList() { ImGui.TextUnformatted($"Messages: {this.Messages.Count:N0} / {10 + this.Plugin.Ui.MainWindow.ExtraMessages:N0}"); ImGui.Separator(); @@ -112,8 +119,6 @@ internal class MessageList : ITab { } ImGui.EndChild(); - - this.MessagesMutex.Release(); } private void Refresh() { @@ -126,10 +131,13 @@ internal class MessageList : ITab { var json = await resp.Content.ReadAsStringAsync(); var messages = JsonConvert.DeserializeObject(json)!; await this.MessagesMutex.WaitAsync(); - this.Plugin.Ui.MainWindow.ExtraMessages = messages.Extra; - this.Messages.Clear(); - this.Messages.AddRange(messages.Messages); - this.MessagesMutex.Release(); + try { + this.Plugin.Ui.MainWindow.ExtraMessages = messages.Extra; + this.Messages.Clear(); + this.Messages.AddRange(messages.Messages); + } finally { + this.MessagesMutex.Release(); + } }); }