#include "ChatRoom.h" #include "WebSocketChatSession.h" void ChatRoom::join(WebSocketSession *session) { std::lock_guard lock(m_mutex); m_sessions.insert(session); } void ChatRoom::leave(WebSocketSession *session) { std::lock_guard lock(m_mutex); m_sessions.erase(session); } void ChatRoom::send(std::string message) { auto const ss = std::make_shared(std::move(message)); // Make a local list of all the weak pointers representing // the sessions, so we can do the actual sending without // holding the mutex: std::vector> v; { std::lock_guard lock(m_mutex); v.reserve(m_sessions.size()); for (auto p : m_sessions) v.emplace_back(p->weak_from_this()); } // For each session in our local list, try to acquire a strong // pointer. If successful, then send the message on that session. for (auto const &wp : v) if (auto sp = wp.lock()) sp->send(ss); }