diff --git a/Iceshrimp.Backend/Core/Helpers/EventHelpers.cs b/Iceshrimp.Backend/Core/Helpers/EventHelpers.cs index 1b9cac0e..dfd22207 100644 --- a/Iceshrimp.Backend/Core/Helpers/EventHelpers.cs +++ b/Iceshrimp.Backend/Core/Helpers/EventHelpers.cs @@ -6,10 +6,11 @@ public sealed class AsyncAutoResetEvent(bool signaled = false) private readonly List> _noResetTaskCompletionSources = []; private readonly List> _taskCompletionSources = []; + private readonly Lock _lock = new(); public Task WaitAsync(CancellationToken cancellationToken = default) { - lock (_taskCompletionSources) + lock (_lock) { if (Signaled) { @@ -26,7 +27,7 @@ public sealed class AsyncAutoResetEvent(bool signaled = false) public Task WaitWithoutResetAsync(CancellationToken cancellationToken = default) { - lock (_taskCompletionSources) + lock (_lock) { if (Signaled) return Task.FromResult(true); @@ -40,7 +41,7 @@ public sealed class AsyncAutoResetEvent(bool signaled = false) public void Set() { - lock (_taskCompletionSources) + lock (_lock) { Signaled = true; foreach (var tcs in _noResetTaskCompletionSources.ToList()) @@ -63,7 +64,7 @@ public sealed class AsyncAutoResetEvent(bool signaled = false) private static void Callback(object? state) { var (ev, tcs) = ((AsyncAutoResetEvent, TaskCompletionSource))state!; - lock (ev._taskCompletionSources) + lock (ev._lock) { if (tcs.Task.IsCompleted) return; tcs.TrySetCanceled(); diff --git a/Iceshrimp.Backend/Core/Helpers/WriteLockingHashSet.cs b/Iceshrimp.Backend/Core/Helpers/WriteLockingHashSet.cs index 8cafe91d..ba8dd0dd 100644 --- a/Iceshrimp.Backend/Core/Helpers/WriteLockingHashSet.cs +++ b/Iceshrimp.Backend/Core/Helpers/WriteLockingHashSet.cs @@ -7,19 +7,20 @@ namespace Iceshrimp.Backend.Core.Helpers; Justification = "This is intentional (it's a *write* locking hash set, after all)")] public class WriteLockingHashSet(IEnumerable? sourceCollection = null) : ICollection { - private readonly HashSet _set = sourceCollection?.ToHashSet() ?? []; + private readonly HashSet _set = sourceCollection?.ToHashSet() ?? []; + private readonly Lock _lock = new(); public IEnumerator GetEnumerator() => _set.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => _set.GetEnumerator(); public void Add(T item) { - lock (_set) _set.Add(item); + lock (_lock) _set.Add(item); } public void Clear() { - lock (_set) _set.Clear(); + lock (_lock) _set.Clear(); } public bool Contains(T item) => _set.Contains(item); @@ -28,7 +29,7 @@ public class WriteLockingHashSet(IEnumerable? sourceCollection = null) : I public bool Remove(T item) { - lock (_set) return _set.Remove(item); + lock (_lock) return _set.Remove(item); } public int Count => _set.Count; @@ -36,18 +37,18 @@ public class WriteLockingHashSet(IEnumerable? sourceCollection = null) : I public bool AddIfMissing(T item) { - lock (_set) return _set.Add(item); + lock (_lock) return _set.Add(item); } public void AddRange(IEnumerable items) { - lock (_set) + lock (_lock) foreach (var item in items) _set.Add(item); } public int RemoveWhere(Predicate predicate) { - lock (_set) return _set.RemoveWhere(predicate); + lock (_lock) return _set.RemoveWhere(predicate); } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Helpers/WriteLockingList.cs b/Iceshrimp.Backend/Core/Helpers/WriteLockingList.cs index 31ba95be..1dbee13e 100644 --- a/Iceshrimp.Backend/Core/Helpers/WriteLockingList.cs +++ b/Iceshrimp.Backend/Core/Helpers/WriteLockingList.cs @@ -8,18 +8,19 @@ namespace Iceshrimp.Backend.Core.Helpers; public class WriteLockingList(IEnumerable? sourceCollection = null) : ICollection { private readonly List _list = sourceCollection?.ToList() ?? []; + private readonly Lock _lock = new(); public IEnumerator GetEnumerator() => _list.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => _list.GetEnumerator(); public void Add(T item) { - lock (_list) _list.Add(item); + lock (_lock) _list.Add(item); } public void Clear() { - lock (_list) _list.Clear(); + lock (_lock) _list.Clear(); } public bool Contains(T item) => _list.Contains(item); @@ -28,7 +29,7 @@ public class WriteLockingList(IEnumerable? sourceCollection = null) : ICol public bool Remove(T item) { - lock (_list) return _list.Remove(item); + lock (_lock) return _list.Remove(item); } public int Count => _list.Count; @@ -36,7 +37,7 @@ public class WriteLockingList(IEnumerable? sourceCollection = null) : ICol public bool AddIfMissing(T item) { - lock (_list) + lock (_lock) { if (_list.Contains(item)) return false; _list.Add(item); @@ -46,11 +47,11 @@ public class WriteLockingList(IEnumerable? sourceCollection = null) : ICol public void AddRange(IEnumerable item) { - lock (_list) _list.AddRange(item); + lock (_lock) _list.AddRange(item); } public int RemoveAll(Predicate predicate) { - lock (_list) return _list.RemoveAll(predicate); + lock (_lock) return _list.RemoveAll(predicate); } } \ No newline at end of file