| 12605 | } |
| 12606 | |
| 12607 | void ReadWriteLock::enterWrite() const noexcept |
| 12608 | { |
| 12609 | const Thread::ThreadID threadId = Thread::getCurrentThreadId(); |
| 12610 | const SpinLock::ScopedLockType sl (accessLock); |
| 12611 | |
| 12612 | for (;;) |
| 12613 | { |
| 12614 | if (readerThreads.size() + numWriters == 0 |
| 12615 | || threadId == writerThreadId |
| 12616 | || (readerThreads.size() == 2 |
| 12617 | && readerThreads.getUnchecked(0) == threadId)) |
| 12618 | { |
| 12619 | writerThreadId = threadId; |
| 12620 | ++numWriters; |
| 12621 | break; |
| 12622 | } |
| 12623 | |
| 12624 | ++numWaitingWriters; |
| 12625 | accessLock.exit(); |
| 12626 | waitEvent.wait (100); |
| 12627 | accessLock.enter(); |
| 12628 | --numWaitingWriters; |
| 12629 | } |
| 12630 | } |
| 12631 | |
| 12632 | bool ReadWriteLock::tryEnterWrite() const noexcept |
| 12633 | { |
no test coverage detected