fix: try/finally all mutexes

This commit is contained in:
Anna 2023-01-21 22:42:03 -05:00
parent 97947bd768
commit 3a09ad989d
Signed by: anna
GPG Key ID: 0B391D8F06FCD9E0
3 changed files with 54 additions and 26 deletions

View File

@ -190,14 +190,16 @@ internal class Messages : IDisposable {
var messages = JsonConvert.DeserializeObject<Message[]>(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<Message> Nearby() {
@ -221,27 +226,39 @@ internal class Messages : IDisposable {
var position = player.Position;
List<Message> 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();
}
}
}

View File

@ -20,8 +20,11 @@ public class Pack {
var json = await resp.Content.ReadAsStringAsync();
var packs = JsonConvert.DeserializeObject<Pack[]>(json)!;
await AllMutex.WaitAsync();
All = packs;
AllMutex.Release();
try {
All = packs;
} finally {
AllMutex.Release();
}
});
}
}

View File

@ -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<MyMessages>(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();
}
});
}