ServiceContext::UniqueClient ServiceContext::makeClient(std::string desc, AbstractMessagingPort* p) { std::unique_ptr<Client> client(new Client(std::move(desc), this, p)); auto observer = _clientObservers.cbegin(); try { for (; observer != _clientObservers.cend(); ++observer) { observer->get()->onCreateClient(client.get()); } } catch (...) { try { while (observer != _clientObservers.cbegin()) { --observer; observer->get()->onDestroyClient(client.get()); } } catch (...) { std::terminate(); } throw; } { stdx::lock_guard<stdx::mutex> lk(_mutex); invariant(_clients.insert(client.get()).second); } return UniqueClient(client.release()); }
ServiceContext::UniqueClient ServiceContext::makeClient(std::string desc, transport::SessionHandle session) { std::unique_ptr<Client> client(new Client(std::move(desc), this, std::move(session))); onCreate(client.get(), _clientObservers); { stdx::lock_guard<stdx::mutex> lk(_mutex); invariant(_clients.insert(client.get()).second); } return UniqueClient(client.release()); }