28 readerThreads.ensureStorageAllocated (16);
33 jassert (readerThreads.size() == 0);
34 jassert (numWriters == 0);
41 readWaitEvent.wait (100);
50 for (
auto& readerThread : readerThreads)
52 if (readerThread.threadID == threadId)
59 if (numWriters + numWaitingWriters == 0
60 || (threadId == writerThreadId && numWriters > 0))
62 readerThreads.add ({ threadId, 1 });
74 for (
int i = 0; i < readerThreads.size(); ++i)
76 auto& readerThread = readerThreads.getReference (i);
78 if (readerThread.threadID == threadId)
80 if (--(readerThread.count) == 0)
82 readerThreads.remove (i);
84 readWaitEvent.signal();
85 writeWaitEvent.signal();
101 while (! tryEnterWriteInternal (threadId))
105 writeWaitEvent.wait (100);
117bool ReadWriteLock::tryEnterWriteInternal (
Thread::ThreadID threadId)
const noexcept
119 if (readerThreads.size() + numWriters == 0
120 || threadId == writerThreadId
121 || (readerThreads.size() == 1 && readerThreads.getReference (0).threadID == threadId))
123 writerThreadId = threadId;
138 if (--numWriters == 0)
142 readWaitEvent.signal();
143 writeWaitEvent.signal();
bool tryEnterRead() const noexcept
void enterWrite() const noexcept
~ReadWriteLock() noexcept
void exitRead() const noexcept
void enterRead() const noexcept
void exitWrite() const noexcept
bool tryEnterWrite() const noexcept
GenericScopedLock< SpinLock > ScopedLockType
static ThreadID JUCE_CALLTYPE getCurrentThreadId()