ScopedCheckedOutSession SessionCatalog::checkOutSession(OperationContext* opCtx) { invariant(!opCtx->lockState()->isLocked()); invariant(opCtx->getLogicalSessionId()); const auto& lsid = *opCtx->getLogicalSessionId(); stdx::unique_lock<stdx::mutex> ul(_mutex); auto sri = _getOrCreateSessionRuntimeInfo(opCtx, lsid, ul); // Wait until the session is no longer in use opCtx->waitForConditionOrInterrupt( sri->availableCondVar, ul, [&sri]() { return sri->state != SessionRuntimeInfo::kInUse; }); invariant(sri->state == SessionRuntimeInfo::kAvailable); sri->state = SessionRuntimeInfo::kInUse; return ScopedCheckedOutSession(opCtx, ScopedSession(std::move(sri))); }
ScopedSession SessionCatalog::checkOutSession(OperationContext* opCtx) { invariant(!opCtx->lockState()->isLocked()); invariant(opCtx->getLogicalSessionId()); const auto lsid = *opCtx->getLogicalSessionId(); stdx::unique_lock<stdx::mutex> ul(_mutex); auto it = _txnTable.find(lsid); if (it == _txnTable.end()) { it = _txnTable.emplace(lsid, std::make_shared<SessionRuntimeInfo>(lsid)).first; } auto sri = it->second; // Wait until the session is no longer in use opCtx->waitForConditionOrInterrupt( sri->availableCondVar, ul, [sri]() { return sri->state != SessionRuntimeInfo::kInUse; }); invariant(sri->state == SessionRuntimeInfo::kAvailable); sri->state = SessionRuntimeInfo::kInUse; return ScopedSession(opCtx, std::move(sri)); }
ScopedSession SessionCatalog::getOrCreateSession(OperationContext* opCtx, const LogicalSessionId& lsid) { stdx::unique_lock<stdx::mutex> ul(_mutex); return ScopedSession(_getOrCreateSessionRuntimeInfo(opCtx, lsid, ul)); }