From 7d019ad5a16fa7d6ecfbf2fb096314013568eaf8 Mon Sep 17 00:00:00 2001 From: jules Date: Tue, 11 Dec 2012 22:05:57 +0000 Subject: [PATCH] Added ReadWriteLock::tryEnterRead() --- .../juce_core/threads/juce_ReadWriteLock.cpp | 43 ++++++++++--------- .../juce_core/threads/juce_ReadWriteLock.h | 12 ++++++ 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/modules/juce_core/threads/juce_ReadWriteLock.cpp b/modules/juce_core/threads/juce_ReadWriteLock.cpp index 4e7ef20784..6aecf1868c 100644 --- a/modules/juce_core/threads/juce_ReadWriteLock.cpp +++ b/modules/juce_core/threads/juce_ReadWriteLock.cpp @@ -39,34 +39,37 @@ ReadWriteLock::~ReadWriteLock() noexcept //============================================================================== void ReadWriteLock::enterRead() const noexcept +{ + while (! tryEnterRead()) + waitEvent.wait (100); +} + +bool ReadWriteLock::tryEnterRead() const noexcept { const Thread::ThreadID threadId = Thread::getCurrentThreadId(); + const SpinLock::ScopedLockType sl (accessLock); - for (;;) + for (int i = 0; i < readerThreads.size(); ++i) { - for (int i = 0; i < readerThreads.size(); ++i) + ThreadRecursionCount& trc = readerThreads.getReference(i); + + if (trc.threadID == threadId) { - ThreadRecursionCount& trc = readerThreads.getReference(i); - - if (trc.threadID == threadId) - { - trc.count++; - return; - } + trc.count++; + return true; } - - if (numWriters + numWaitingWriters == 0 - || (threadId == writerThreadId && numWriters > 0)) - { - ThreadRecursionCount trc = { threadId, 1 }; - readerThreads.add (trc); - return; - } - - const SpinLock::ScopedUnlockType ul (accessLock); - waitEvent.wait (100); } + + if (numWriters + numWaitingWriters == 0 + || (threadId == writerThreadId && numWriters > 0)) + { + ThreadRecursionCount trc = { threadId, 1 }; + readerThreads.add (trc); + return true; + } + + return false; } void ReadWriteLock::exitRead() const noexcept diff --git a/modules/juce_core/threads/juce_ReadWriteLock.h b/modules/juce_core/threads/juce_ReadWriteLock.h index d74b8f76cf..b5a37c2d5d 100644 --- a/modules/juce_core/threads/juce_ReadWriteLock.h +++ b/modules/juce_core/threads/juce_ReadWriteLock.h @@ -79,6 +79,17 @@ public: */ void enterRead() const noexcept; + /** Tries to lock this object for reading. + + Multiple threads can simulaneously lock the object for reading, but if another + thread has it locked for writing, then this will block until it releases the + lock. + + @returns true if the lock is successfully gained. + @see exitRead, ScopedReadLock + */ + bool tryEnterRead() const noexcept; + /** Releases the read-lock. If the caller thread hasn't got the lock, this can have unpredictable results. @@ -106,6 +117,7 @@ public: This is like enterWrite(), but doesn't block - it returns true if it manages to obtain the lock. + @returns true if the lock is successfully gained. @see enterWrite */ bool tryEnterWrite() const noexcept;