diff --git a/src/rwlock.jl b/src/rwlock.jl index aaf02fc..c0223ee 100644 --- a/src/rwlock.jl +++ b/src/rwlock.jl @@ -11,7 +11,7 @@ while the write side is acquired/released via `lock(rw)` and `unlock(rw)`. While a writer is active, all readers will block. Once the writer is finished, all pending readers will be allowed to acquire/release before the next writer. """ -mutable struct ReadWriteLock +mutable struct ReadWriteLock <: Base.AbstractLock writelock::ReentrantLock readwait::Threads.Condition writeready::Threads.Event @@ -95,6 +95,23 @@ function Base.lock(rw::ReadWriteLock) return end +function Base.trylock(rw::ReadWriteLock) + success = trylock(rw.writelock) + success || return false + + r = (@atomic :acquire_release rw.readercount -= MaxReaders) + MaxReaders + if r != 0 + r = (@atomic :acquire_release rw.readercount += MaxReaders) + if r > 0 + # wake up waiting readers + Base.@lock rw.readwait notify(rw.readwait) + end + unlock(rw.writelock) + return false + end + return true +end + Base.islocked(rw::ReadWriteLock) = islocked(rw.writelock) function Base.unlock(rw::ReadWriteLock) @@ -107,4 +124,4 @@ function Base.unlock(rw::ReadWriteLock) return end -end \ No newline at end of file +end