diff options
Diffstat (limited to 'lib/Utils/src/Async')
-rw-r--r-- | lib/Utils/src/Async/AsyncAccessSerializer.cs | 43 | ||||
-rw-r--r-- | lib/Utils/src/Async/AsyncQueue.cs | 12 |
2 files changed, 20 insertions, 35 deletions
diff --git a/lib/Utils/src/Async/AsyncAccessSerializer.cs b/lib/Utils/src/Async/AsyncAccessSerializer.cs index 76532bc..1beb4dc 100644 --- a/lib/Utils/src/Async/AsyncAccessSerializer.cs +++ b/lib/Utils/src/Async/AsyncAccessSerializer.cs @@ -1,5 +1,5 @@ /* -* Copyright (c) 2023 Vaughn Nugent +* Copyright (c) 2024 Vaughn Nugent * * Library: VNLib * Package: VNLib.Utils @@ -37,42 +37,35 @@ namespace VNLib.Utils.Async /// Creates a base concrete implementation of an <see cref="IAsyncAccessSerializer{TMoniker}"/> /// </summary> /// <typeparam name="TMoniker">The moniker (key) type</typeparam> - public class AsyncAccessSerializer<TMoniker> : IAsyncAccessSerializer<TMoniker>, ICacheHolder where TMoniker : notnull + /// <remarks> + /// Initializes a new <see cref="AsyncAccessSerializer{TMoniker}"/> with the desired + /// caching pool size and initial capacity + /// </remarks> + /// <param name="maxPoolSize">The maxium number of cached wait entry objects</param> + /// <param name="initialCapacity">The initial capacity of the wait table</param> + /// <param name="keyComparer">The moniker key comparer</param> + public class AsyncAccessSerializer<TMoniker>(int maxPoolSize, int initialCapacity, IEqualityComparer<TMoniker>? keyComparer) + : IAsyncAccessSerializer<TMoniker>, ICacheHolder where TMoniker : notnull { /// <summary> /// The mutual exclusion monitor locking object /// </summary> - protected object StoreLock { get; } + protected object StoreLock { get; } = new(); /// <summary> /// A cache pool for <see cref="WaitEntry"/> /// </summary> - protected Stack<WaitEntry> EntryPool { get; } + protected Stack<WaitEntry> EntryPool { get; } = new(maxPoolSize); /// <summary> /// The table containing all active waiters /// </summary> - protected Dictionary<TMoniker, WaitEntry> WaitTable { get; } + protected Dictionary<TMoniker, WaitEntry> WaitTable { get; } = new(initialCapacity, keyComparer); /// <summary> /// The maxium number of elements allowed in the internal entry cache pool /// </summary> - protected int MaxPoolSize { get; } - - /// <summary> - /// Initializes a new <see cref="AsyncAccessSerializer{TMoniker}"/> with the desired - /// caching pool size and initial capacity - /// </summary> - /// <param name="maxPoolSize">The maxium number of cached wait entry objects</param> - /// <param name="initialCapacity">The initial capacity of the wait table</param> - /// <param name="keyComparer">The moniker key comparer</param> - public AsyncAccessSerializer(int maxPoolSize, int initialCapacity, IEqualityComparer<TMoniker>? keyComparer) - { - MaxPoolSize = maxPoolSize; - StoreLock = new(); - EntryPool = new(maxPoolSize); - WaitTable = new(initialCapacity, keyComparer); - } + protected int MaxPoolSize { get; } = maxPoolSize; ///<inheritdoc/> public virtual Task WaitAsync(TMoniker moniker, CancellationToken cancellation = default) @@ -464,11 +457,9 @@ namespace VNLib.Utils.Async * next task in the queue and be awaitable as a task */ - private sealed class TaskNode : Task + private sealed class TaskNode(Action<object?> callback, object item, CancellationToken cancellation) + : Task(callback, item, cancellation) { - public TaskNode(Action<object?> callback, object item, CancellationToken cancellation) : base(callback, item, cancellation) - { } - public TaskNode? Next { get; set; } } @@ -500,7 +491,7 @@ namespace VNLib.Utils.Async /// another waiter is not selected. /// </para> /// </summary> - /// <returns>A value that indicates if the task was transition successfully</returns> + /// <returns>A value that indicates if the task was transitioned successfully</returns> public readonly bool Release() { //return success if no next waiter diff --git a/lib/Utils/src/Async/AsyncQueue.cs b/lib/Utils/src/Async/AsyncQueue.cs index 45f1219..e94d08e 100644 --- a/lib/Utils/src/Async/AsyncQueue.cs +++ b/lib/Utils/src/Async/AsyncQueue.cs @@ -1,5 +1,5 @@ /* -* Copyright (c) 2023 Vaughn Nugent +* Copyright (c) 2024 Vaughn Nugent * * Library: VNLib * Package: VNLib.Utils @@ -93,19 +93,13 @@ namespace VNLib.Utils.Async /// Initalizes a new unbound channel based queue /// </summary> /// <param name="ubOptions">Channel options</param> - public AsyncQueue(UnboundedChannelOptions ubOptions) - { - _channel = Channel.CreateUnbounded<T>(ubOptions); - } + public AsyncQueue(UnboundedChannelOptions ubOptions) => _channel = Channel.CreateUnbounded<T>(ubOptions); /// <summary> /// Initalizes a new bound channel based queue /// </summary> /// <param name="options">Channel options</param> - public AsyncQueue(BoundedChannelOptions options) - { - _channel = Channel.CreateBounded<T>(options); - } + public AsyncQueue(BoundedChannelOptions options) => _channel = Channel.CreateBounded<T>(options); /// <inheritdoc/> public bool TryEnque(T item) => _channel.Writer.TryWrite(item); |