11// Copyright (c) usercode
2- // https://github.com/usercode/AsyncLock
2+ // https://github.com/usercode/AsyncKeyLock
33// MIT License
44
55namespace AsyncKeyLock ;
@@ -13,8 +13,8 @@ public AsyncLock()
1313 {
1414 _syncObj = _waitingWriters ;
1515
16- _readerReleaserTask = Task . FromResult ( new AsyncLockReleaser ( this , AsyncLockType . Read , true ) ) ;
17- _writerReleaserTask = Task . FromResult ( new AsyncLockReleaser ( this , AsyncLockType . Write , true ) ) ;
16+ _readerReleaserTask = Task . FromResult ( new ReaderReleaser ( this , true ) ) ;
17+ _writerReleaserTask = Task . FromResult ( new WriterReleaser ( this , true ) ) ;
1818 }
1919
2020 internal AsyncLock ( object syncObject )
@@ -25,13 +25,12 @@ internal AsyncLock(object syncObject)
2525
2626 private readonly object _syncObj ;
2727
28- private readonly Queue < TaskCompletionSource < AsyncLockReleaser > > _waitingReaders = new Queue < TaskCompletionSource < AsyncLockReleaser > > ( ) ;
29- private readonly Queue < TaskCompletionSource < AsyncLockReleaser > > _waitingWriters = new Queue < TaskCompletionSource < AsyncLockReleaser > > ( ) ;
28+ private readonly Queue < TaskCompletionSource < ReaderReleaser > > _waitingReaders = new Queue < TaskCompletionSource < ReaderReleaser > > ( ) ;
29+ private readonly Queue < TaskCompletionSource < WriterReleaser > > _waitingWriters = new Queue < TaskCompletionSource < WriterReleaser > > ( ) ;
3030
31- private readonly Task < AsyncLockReleaser > _readerReleaserTask ;
32- private readonly Task < AsyncLockReleaser > _writerReleaserTask ;
31+ private readonly Task < ReaderReleaser > _readerReleaserTask ;
32+ private readonly Task < WriterReleaser > _writerReleaserTask ;
3333
34-
3534 private int _readersRunning ;
3635
3736 private bool _isWriterRunning = false ;
@@ -80,11 +79,11 @@ public AsyncLockState State
8079 }
8180 }
8281
83- public Task < AsyncLockReleaser > ReaderLockAsync ( CancellationToken cancellation = default )
82+ public Task < ReaderReleaser > ReaderLockAsync ( CancellationToken cancellation = default )
8483 {
8584 if ( cancellation . IsCancellationRequested )
8685 {
87- return Task . FromCanceled < AsyncLockReleaser > ( cancellation ) ;
86+ return Task . FromCanceled < ReaderReleaser > ( cancellation ) ;
8887 }
8988
9089 lock ( _syncObj )
@@ -93,47 +92,47 @@ public Task<AsyncLockReleaser> ReaderLockAsync(CancellationToken cancellation =
9392 if ( _isWriterRunning == false && _waitingWriters . Count == 0 )
9493 {
9594 _readersRunning ++ ;
95+
9696 return _readerReleaserTask ;
9797 }
9898 else
9999 {
100100 //create waiting reader
101- TaskCompletionSource < AsyncLockReleaser > waiter = _waitingReaders . Enqueue ( cancellation ) ;
102- return waiter . Task ;
101+ return _waitingReaders . Enqueue ( cancellation ) ;
103102 }
104103 }
105104 }
106105
107- public Task < AsyncLockReleaser > WriterLockAsync ( CancellationToken cancellation = default )
106+ public Task < WriterReleaser > WriterLockAsync ( CancellationToken cancellation = default )
108107 {
109108 if ( cancellation . IsCancellationRequested )
110109 {
111- return Task . FromCanceled < AsyncLockReleaser > ( cancellation ) ;
110+ return Task . FromCanceled < WriterReleaser > ( cancellation ) ;
112111 }
113112
114113 lock ( _syncObj )
115114 {
116115 if ( _isWriterRunning == false && _readersRunning == 0 )
117116 {
118117 _isWriterRunning = true ;
118+
119119 return _writerReleaserTask ;
120120 }
121121 else
122122 {
123123 //create waiting writer
124- TaskCompletionSource < AsyncLockReleaser > waiter = _waitingWriters . Enqueue ( cancellation ) ;
125- return waiter . Task ;
124+ return _waitingWriters . Enqueue ( cancellation ) ;
126125 }
127126 }
128127 }
129128
130- internal void Release ( AsyncLockReleaser releaser )
129+ internal void Release ( AsyncLockType type )
131130 {
132131 lock ( _syncObj )
133132 {
134133 try
135134 {
136- if ( releaser . Type == AsyncLockType . Write )
135+ if ( type == AsyncLockType . Write )
137136 {
138137 WriterRelease ( ) ;
139138 }
@@ -175,7 +174,7 @@ private void WriterRelease()
175174 {
176175 var taskSource = _waitingReaders . Dequeue ( ) ;
177176
178- bool result = taskSource . TrySetResult ( new AsyncLockReleaser ( this , AsyncLockType . Read , false ) ) ;
177+ bool result = taskSource . TrySetResult ( new ReaderReleaser ( this , false ) ) ;
179178
180179 if ( result )
181180 {
@@ -191,7 +190,7 @@ private void StartNextWaitingWriter()
191190 {
192191 var taskSource = _waitingWriters . Dequeue ( ) ;
193192
194- bool result = taskSource . TrySetResult ( new AsyncLockReleaser ( this , AsyncLockType . Write , false ) ) ;
193+ bool result = taskSource . TrySetResult ( new WriterReleaser ( this , false ) ) ;
195194
196195 if ( result == true )
197196 {
0 commit comments