From 0d49ace40b346c347483c5d9c271081e65fe3959 Mon Sep 17 00:00:00 2001 From: Aayush Sabharwal Date: Wed, 6 Aug 2025 15:12:38 -0400 Subject: [PATCH 1/2] refactor: make `ReadWriteLock` subtype `Base.AbstractLock` --- src/rwlock.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rwlock.jl b/src/rwlock.jl index aaf02fc..6c6b448 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 From 44aa8de1e127b8b62ea0b949b8021322f4f0cc95 Mon Sep 17 00:00:00 2001 From: Aayush Sabharwal Date: Wed, 6 Aug 2025 15:12:47 -0400 Subject: [PATCH 2/2] feat: implement `Base.trylock` for `ReadWriteLock` --- src/rwlock.jl | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/rwlock.jl b/src/rwlock.jl index 6c6b448..c0223ee 100644 --- a/src/rwlock.jl +++ b/src/rwlock.jl @@ -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