bool LockerImpl<IsForMMAPV1>::unlock(ResourceId resId) { LockRequestsMap::Iterator it = _requests.find(resId); if (inAWriteUnitOfWork() && shouldDelayUnlock(it.key(), (it->mode))) { _resourcesToUnlockAtEndOfUnitOfWork.push(it.key()); return false; } return _unlockImpl(&it); }
bool LockerImpl::unlock(const ResourceId& resId) { LockRequest* request = _find(resId); invariant(request->mode != MODE_NONE); // Methods on the Locker class are always called single-threadly, so it is safe to release // the spin lock, which protects the Locker here. The only thing which could alter the // state of the request is deadlock detection, which however would synchronize on the // LockManager calls. if (inAWriteUnitOfWork() && shouldDelayUnlock(resId, request->mode)) { _resourcesToUnlockAtEndOfUnitOfWork.push(resId); return false; } return _unlockAndUpdateRequestsList(resId, request); }