Skip to content

Commit 81f47de

Browse files
committed
Optimize performance
1 parent 4eeea79 commit 81f47de

File tree

3 files changed

+20
-27
lines changed

3 files changed

+20
-27
lines changed

src/AsyncKeyLock/AsyncLock.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@ public sealed class AsyncLock
1212
public AsyncLock()
1313
{
1414
_syncObj = _waitingWriters;
15+
16+
_readerReleaserTask = Task.FromResult(new AsyncLockReleaser(this, AsyncLockType.Read, true));
17+
_writerReleaserTask = Task.FromResult(new AsyncLockReleaser(this, AsyncLockType.Write, true));
1518
}
1619

1720
internal AsyncLock(object syncObject)
21+
: this()
1822
{
1923
_syncObj = syncObject;
2024
}
@@ -24,6 +28,10 @@ internal AsyncLock(object syncObject)
2428
private readonly Queue<TaskCompletionSource<AsyncLockReleaser>> _waitingReaders = new Queue<TaskCompletionSource<AsyncLockReleaser>>();
2529
private readonly Queue<TaskCompletionSource<AsyncLockReleaser>> _waitingWriters = new Queue<TaskCompletionSource<AsyncLockReleaser>>();
2630

31+
private readonly Task<AsyncLockReleaser> _readerReleaserTask;
32+
private readonly Task<AsyncLockReleaser> _writerReleaserTask;
33+
34+
2735
private int _readersRunning;
2836

2937
private bool _isWriterRunning = false;
@@ -85,7 +93,7 @@ public Task<AsyncLockReleaser> ReaderLockAsync(CancellationToken cancellation =
8593
if (_isWriterRunning == false && _waitingWriters.Count == 0)
8694
{
8795
_readersRunning++;
88-
return Task.FromResult(new AsyncLockReleaser(this, AsyncLockType.Read, true));
96+
return _readerReleaserTask;
8997
}
9098
else
9199
{
@@ -108,7 +116,7 @@ public Task<AsyncLockReleaser> WriterLockAsync(CancellationToken cancellation =
108116
if (_isWriterRunning == false && _readersRunning == 0)
109117
{
110118
_isWriterRunning = true;
111-
return Task.FromResult(new AsyncLockReleaser(this, AsyncLockType.Write, true));
119+
return _writerReleaserTask;
112120
}
113121
else
114122
{
@@ -119,7 +127,7 @@ public Task<AsyncLockReleaser> WriterLockAsync(CancellationToken cancellation =
119127
}
120128
}
121129

122-
internal void Release(AsyncLockReleaser releaser, bool sendReleasedEvent = true)
130+
internal void Release(AsyncLockReleaser releaser)
123131
{
124132
lock (_syncObj)
125133
{
@@ -136,7 +144,7 @@ internal void Release(AsyncLockReleaser releaser, bool sendReleasedEvent = true)
136144
}
137145
finally
138146
{
139-
if (sendReleasedEvent)
147+
if (State == AsyncLockState.Idle)
140148
{
141149
Released?.Invoke(this);
142150
}

src/AsyncKeyLock/AsyncLockReleaser.cs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,22 @@ namespace AsyncKeyLock;
77
/// <summary>
88
/// AsyncLockReleaser
99
/// </summary>
10-
public sealed class AsyncLockReleaser : IDisposable
10+
public readonly struct AsyncLockReleaser : IDisposable
1111
{
12-
private bool _disposed;
13-
1412
/// <summary>
1513
/// AsyncLock
1614
/// </summary>
17-
private AsyncLock AsyncLock { get; }
15+
private readonly AsyncLock AsyncLock;
1816

1917
/// <summary>
2018
/// Type
2119
/// </summary>
22-
public AsyncLockType Type { get; }
20+
public readonly AsyncLockType Type;
2321

2422
/// <summary>
2523
/// IsAcquiredImmediately
2624
/// </summary>
27-
public bool IsAcquiredImmediately { get; }
25+
public readonly bool IsAcquiredImmediately;
2826

2927
internal AsyncLockReleaser(AsyncLock asyncLock, AsyncLockType type, bool lockAcquiredImmediately)
3028
{
@@ -35,15 +33,6 @@ internal AsyncLockReleaser(AsyncLock asyncLock, AsyncLockType type, bool lockAcq
3533

3634
public void Dispose()
3735
{
38-
if (_disposed)
39-
{
40-
return;
41-
}
42-
4336
AsyncLock.Release(this);
44-
45-
_disposed = true;
46-
47-
GC.SuppressFinalize(this);
4837
}
49-
}
38+
}

src/AsyncKeyLock/AsyncLock~.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,10 @@ private AsyncLock GetAsyncLock(TKey key)
3434
AsyncLock a = new AsyncLock(_locks);
3535
a.Released += x =>
3636
{
37-
//is AsyncLock idle
38-
if (x.State == AsyncLockState.Idle)
39-
{
40-
_locks.Remove(key);
37+
_locks.Remove(key);
4138

42-
//add idle AsynLock to pool
43-
_pool.Add(x);
44-
}
39+
//add idle AsynLock to pool
40+
_pool.Add(x);
4541
};
4642

4743
return a;

0 commit comments

Comments
 (0)