// // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // Official repository: https://github.com/vinniefalco/CppCon2018 // #include "shared_state.hpp" #include "websocket_session.hpp" shared_state:: shared_state(std::string doc_root) : doc_root_(std::move(doc_root)) { } void shared_state:: join(websocket_session* session) { std::lock_guard lock(mutex_); sessions_.insert(session); } void shared_state:: leave(websocket_session* session) { std::lock_guard lock(mutex_); sessions_.erase(session); } // Broadcast a message to all websocket client sessions void shared_state:: send(std::string message) { // Put the message in a shared pointer so we can re-use it for each client auto const ss = boost::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(mutex_); v.reserve(sessions_.size()); for(auto p : 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); }