| 300 | } |
| 301 | |
| 302 | void GlobalRWLock::unlockRead(thread_db* tdbb) |
| 303 | { |
| 304 | SET_TDBB(tdbb); |
| 305 | |
| 306 | CheckoutLockGuard counterGuard(tdbb, counterMutex, FB_FUNCTION, true); |
| 307 | |
| 308 | COS_TRACE(("(%p)->unlockRead readers(%d), blocking(%d), pendingWriters(%d), currentWriter(%d), lck_physical(%d)", |
| 309 | this, readers, blocking, pendingWriters, currentWriter, cachedLock->lck_physical)); |
| 310 | readers--; |
| 311 | |
| 312 | if (!readers) |
| 313 | { |
| 314 | if (!lockCaching || pendingWriters || blocking) |
| 315 | { |
| 316 | LCK_release(tdbb, cachedLock); // Release since concurrent request needs LCK_write |
| 317 | invalidate(tdbb); |
| 318 | } |
| 319 | |
| 320 | noReaders.notifyAll(); |
| 321 | } |
| 322 | COS_TRACE(("(%p)->unlockRead end readers(%d), blocking(%d), pendingWriters(%d), currentWriter(%d), lck_physical(%d)", |
| 323 | this, readers, blocking, pendingWriters, currentWriter, cachedLock->lck_physical)); |
| 324 | } |
| 325 | |
| 326 | bool GlobalRWLock::tryReleaseLock(thread_db* tdbb) |
| 327 | { |
no test coverage detected