void LockerImpl<IsForMMAPV1>::getLockerInfo(LockerInfo* lockerInfo) const { invariant(lockerInfo); // Zero-out the contents lockerInfo->locks.clear(); lockerInfo->waitingResource = ResourceId(); lockerInfo->stats.reset(); _lock.lock(); LockRequestsMap::ConstIterator it = _requests.begin(); while (!it.finished()) { OneLock info; info.resourceId = it.key(); info.mode = it->mode; lockerInfo->locks.push_back(info); it.next(); } _lock.unlock(); std::sort(lockerInfo->locks.begin(), lockerInfo->locks.end()); lockerInfo->waitingResource = getWaitingResource(); lockerInfo->stats.append(_stats); }
void LockerImpl::getLockerInfo(LockerInfo* lockerInfo, const boost::optional<SingleThreadedLockStats> lockStatsBase) const { invariant(lockerInfo); // Zero-out the contents lockerInfo->locks.clear(); lockerInfo->waitingResource = ResourceId(); lockerInfo->stats.reset(); _lock.lock(); LockRequestsMap::ConstIterator it = _requests.begin(); while (!it.finished()) { OneLock info; info.resourceId = it.key(); info.mode = it->mode; lockerInfo->locks.push_back(info); it.next(); } _lock.unlock(); std::sort(lockerInfo->locks.begin(), lockerInfo->locks.end()); lockerInfo->waitingResource = getWaitingResource(); lockerInfo->stats.append(_stats); // lockStatsBase is a snapshot of lock stats taken when the sub-operation starts. Only // sub-operations have lockStatsBase. if (lockStatsBase) // Adjust the lock stats by subtracting the lockStatsBase. No mutex is needed because // lockStatsBase is immutable. lockerInfo->stats.subtract(*lockStatsBase); }
ResourceId LockerImpl<IsForMMAPV1>::getWaitingResource() const { scoped_spinlock scopedLock(_lock); LockRequestsMap::ConstIterator it = _requests.begin(); while (!it.finished()) { if (it->status == LockRequest::STATUS_WAITING || it->status == LockRequest::STATUS_CONVERTING) { return it.key(); } it.next(); } return ResourceId(); }
void LockerImpl<IsForMMAPV1>::dump() const { StringBuilder ss; ss << "Locker id " << _id << " status: "; _lock.lock(); LockRequestsMap::ConstIterator it = _requests.begin(); while (!it.finished()) { ss << it.key().toString() << " " << lockRequestStatusName(it->status) << " in " << modeName(it->mode) << "; "; it.next(); } _lock.unlock(); log() << ss.str(); }