예제 #1
0
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)));
}
예제 #2
0
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));
}
예제 #3
0
ScopedSession SessionCatalog::getOrCreateSession(OperationContext* opCtx,
                                                 const LogicalSessionId& lsid) {
    stdx::unique_lock<stdx::mutex> ul(_mutex);

    return ScopedSession(_getOrCreateSessionRuntimeInfo(opCtx, lsid, ul));
}