Lines Matching defs:lockable

36 RWLockManager::ReadLock(RWLockable* lockable)
40 if (lockable->fWaiters.IsEmpty()) {
41 lockable->fReaderCount++;
45 return _Wait(lockable, false, B_INFINITE_TIMEOUT) == B_OK;
50 RWLockManager::TryReadLock(RWLockable* lockable)
54 if (lockable->fWaiters.IsEmpty()) {
55 lockable->fReaderCount++;
64 RWLockManager::ReadLockWithTimeout(RWLockable* lockable, bigtime_t timeout)
68 if (lockable->fWaiters.IsEmpty()) {
69 lockable->fReaderCount++;
73 return _Wait(lockable, false, timeout);
78 RWLockManager::ReadUnlock(RWLockable* lockable)
82 if (lockable->fReaderCount <= 0) {
87 if (--lockable->fReaderCount == 0)
88 _Unblock(lockable);
93 RWLockManager::WriteLock(RWLockable* lockable)
99 if (lockable->fOwner == thread) {
100 lockable->fOwnerCount++;
104 if (lockable->fReaderCount == 0 && lockable->fWaiters.IsEmpty()) {
105 lockable->fOwnerCount = 1;
106 lockable->fOwner = find_thread(NULL);
110 return _Wait(lockable, true, B_INFINITE_TIMEOUT) == B_OK;
115 RWLockManager::TryWriteLock(RWLockable* lockable)
121 if (lockable->fOwner == thread) {
122 lockable->fOwnerCount++;
126 if (lockable->fReaderCount == 0 && lockable->fWaiters.IsEmpty()) {
127 lockable->fOwnerCount++;
128 lockable->fOwner = thread;
137 RWLockManager::WriteLockWithTimeout(RWLockable* lockable, bigtime_t timeout)
143 if (lockable->fOwner == thread) {
144 lockable->fOwnerCount++;
148 if (lockable->fReaderCount == 0 && lockable->fWaiters.IsEmpty()) {
149 lockable->fOwnerCount++;
150 lockable->fOwner = thread;
154 return _Wait(lockable, true, timeout);
159 RWLockManager::WriteUnlock(RWLockable* lockable)
163 if (find_thread(NULL) != lockable->fOwner) {
169 if (--lockable->fOwnerCount == 0) {
170 lockable->fOwner = -1;
171 _Unblock(lockable);
177 RWLockManager::_Wait(RWLockable* lockable, bool writer, bigtime_t timeout)
184 lockable->fWaiters.Add(&waiter);
206 lockable->fWaiters.Remove(&waiter);
208 _Unblock(lockable);
215 RWLockManager::_Unblock(RWLockable* lockable)
219 RWLockable::Waiter* waiter = lockable->fWaiters.Head();
220 if (waiter == NULL || lockable->fOwner >= 0)
225 if (lockable->fReaderCount == 0) {
228 lockable->fWaiters.Remove(waiter);
229 lockable->fOwner = waiter->thread;
230 lockable->fOwnerCount = 1;
239 while (!lockable->fWaiters.IsEmpty()
240 && !lockable->fWaiters.Head()->writer) {
246 && (waiter = lockable->fWaiters.Head()) != NULL
250 lockable->fWaiters.Remove(waiter);
253 lockable->fReaderCount++;