diff --git a/src/ripple/websocket/Server.h b/src/ripple/websocket/Server.h index 42864be13..847fa9da4 100644 --- a/src/ripple/websocket/Server.h +++ b/src/ripple/websocket/Server.h @@ -17,57 +17,55 @@ */ //============================================================================== -#ifndef RIPPLED_RIPPLE_WEBSOCKET_WSDOORBASE_H -#define RIPPLED_RIPPLE_WEBSOCKET_WSDOORBASE_H +#ifndef RIPPLE_WEBSOCKET_SERVER_H_INCLUDED +#define RIPPLE_WEBSOCKET_SERVER_H_INCLUDED #include #include -#include // #include +#include namespace ripple { namespace websocket { template -class Server - : public beast::Stoppable - , protected beast::Thread +class Server : public beast::Stoppable { private: - // TODO: why is this recursive? - using LockType = std::recursive_mutex; - using ScopedLockType = std::lock_guard ; - ServerDescription desc_; - LockType m_endpointLock; + std::recursive_mutex endpointMutex_; // TODO: why is this recursive? + std::thread thread_; beast::Journal j_; - typename WebSocket::EndpointPtr m_endpoint; + typename WebSocket::EndpointPtr endpoint_; public: Server (ServerDescription const& desc) - : beast::Stoppable (WebSocket::versionName(), desc.source) - , Thread ("websocket") + : beast::Stoppable (WebSocket::versionName(), desc.source) , desc_(desc) - , j_ (desc.app.journal ("WebSocket")) + , j_ (desc.app.journal ("WebSocket")) { - startThread (); } ~Server () { - stopThread (); + assert (!thread_.joinable()); + + if (thread_.joinable()) + LogicError ("WebSocket::Server::onStop not called."); } private: - void run () override + void run () { + beast::Thread::setCurrentThreadName ("WebSocket"); + JLOG (j_.warning) << "Websocket: creating endpoint " << desc_.port; - auto handler = WebSocket::makeHandler (desc_); { - ScopedLockType lock (m_endpointLock); - m_endpoint = WebSocket::makeEndpoint (std::move (handler)); + auto handler = WebSocket::makeHandler (desc_); + std::lock_guard lock (endpointMutex_); + endpoint_ = WebSocket::makeEndpoint (std::move (handler)); } JLOG (j_.warning) @@ -75,8 +73,8 @@ private: listen(); { - ScopedLockType lock (m_endpointLock); - m_endpoint.reset(); + std::lock_guard lock (endpointMutex_); + endpoint_.reset(); } JLOG (j_.warning) @@ -87,6 +85,11 @@ private: << "Websocket: stopped on " << desc_.port; } + void onStart () override + { + thread_ = std::thread {&Server::run, this}; + } + void onStop () override { JLOG (j_.warning) @@ -94,13 +97,14 @@ private: typename WebSocket::EndpointPtr endpoint; { - ScopedLockType lock (m_endpointLock); - endpoint = m_endpoint; + std::lock_guard lock (endpointMutex_); + endpoint = endpoint_; } if (endpoint) endpoint->stop (); - signalThreadShouldExit (); + + thread_.join(); } void listen(); diff --git a/src/ripple/websocket/WebSocket02.cpp b/src/ripple/websocket/WebSocket02.cpp index 33a334fd3..c197d39b5 100644 --- a/src/ripple/websocket/WebSocket02.cpp +++ b/src/ripple/websocket/WebSocket02.cpp @@ -95,7 +95,7 @@ void Server ::listen() { try { - m_endpoint->listen (desc_.port.ip, desc_.port.port); + endpoint_->listen (desc_.port.ip, desc_.port.port); } catch (std::exception const& e) { @@ -106,7 +106,7 @@ void Server ::listen() // https://github.com/zaphoyd/websocketpp/issues/98 try { - m_endpoint->get_io_service ().run (); + endpoint_->get_io_service ().run (); break; } catch (std::exception const& e) diff --git a/src/ripple/websocket/WebSocket04.cpp b/src/ripple/websocket/WebSocket04.cpp index 5ce9e1af8..b9ba6c61f 100644 --- a/src/ripple/websocket/WebSocket04.cpp +++ b/src/ripple/websocket/WebSocket04.cpp @@ -138,9 +138,9 @@ boost::asio::io_service::strand& WebSocket04::getStrand (Connection& con) template <> void Server ::listen() { - m_endpoint->listen (desc_.port.ip, desc_.port.port); - m_endpoint->start_accept(); - auto c = m_endpoint->get_io_service ().run (); + endpoint_->listen (desc_.port.ip, desc_.port.port); + endpoint_->start_accept(); + auto c = endpoint_->get_io_service ().run (); JLOG (j_.warning) << "Server run with: '" << c;