ServiceContext::UniqueOperationContext ServiceContext::makeOperationContext(Client* client) { auto opCtx = _newOpCtx(client); auto observer = _clientObservers.begin(); try { for (; observer != _clientObservers.cend(); ++observer) { observer->get()->onCreateOperationContext(opCtx.get()); } } catch (...) { try { while (observer != _clientObservers.cbegin()) { --observer; observer->get()->onDestroyOperationContext(opCtx.get()); } } catch (...) { std::terminate(); } throw; } // // TODO(schwerin): When callers no longer construct their own OperationContexts directly, // // but only through the ServiceContext, uncomment the following. Until then, it must // // be done in the operation context destructors, which introduces a potential race. // { // stdx::lock_guard<Client> lk(*client); // client->setOperationContext(opCtx.get()); // } return UniqueOperationContext(opCtx.release()); };
ServiceContext::UniqueOperationContext ServiceContext::makeOperationContext(Client* client) { auto opCtx = _newOpCtx(client, _nextOpId.fetchAndAdd(1)); auto observer = _clientObservers.begin(); try { for (; observer != _clientObservers.cend(); ++observer) { observer->get()->onCreateOperationContext(opCtx.get()); } } catch (...) { try { while (observer != _clientObservers.cbegin()) { --observer; observer->get()->onDestroyOperationContext(opCtx.get()); } } catch (...) { std::terminate(); } throw; } { stdx::lock_guard<Client> lk(*client); client->setOperationContext(opCtx.get()); } return UniqueOperationContext(opCtx.release()); };