From cfc491ffceeb67ff463dc4227a60487cef53139b Mon Sep 17 00:00:00 2001 From: Peter Thorson Date: Sun, 11 Mar 2012 13:19:53 -0500 Subject: [PATCH] fixes some concurrency bugs --- examples/wsperf/request.hpp | 11 ++++++++--- src/connection.hpp | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/examples/wsperf/request.hpp b/examples/wsperf/request.hpp index 3c3dd07b47..024a46557a 100644 --- a/examples/wsperf/request.hpp +++ b/examples/wsperf/request.hpp @@ -93,9 +93,10 @@ struct request { class request_coordinator { public: void add_request(const request& r) { - boost::unique_lock lock(m_lock); - m_requests.push(r); - lock.unlock(); + { + boost::unique_lock lock(m_lock); + m_requests.push(r); + } m_cond.notify_one(); } @@ -163,6 +164,10 @@ public: void on_fail(connection_ptr con) { std::cout << "A command connection failed." << std::endl; } + + void on_close(connection_ptr con) { + std::cout << "A command connection closed." << std::endl; + } private: request_coordinator& m_coordinator; std::string m_ident; diff --git a/src/connection.hpp b/src/connection.hpp index e47b304af4..405843217b 100644 --- a/src/connection.hpp +++ b/src/connection.hpp @@ -138,6 +138,11 @@ public: // Valid for OPEN state /// convenience overload for sending a one off text message. void send(const std::string& payload, frame::opcode::value op = frame::opcode::TEXT) { + // TODO: do we need a lock? + if (m_state != session::state::OPEN) { + return; + } + websocketpp::message::data::ptr msg = get_control_message2(); if (!msg) { @@ -152,6 +157,11 @@ public: send(msg); } void send(message::data_ptr msg) { + // TODO: do we need a lock? + if (m_state != session::state::OPEN) { + return; + } + m_processor->prepare_frame(msg); write_message(msg); } @@ -165,9 +175,19 @@ public: } } void ping(const std::string& payload) { + // TODO: do we need a lock? + if (m_state != session::state::OPEN) { + return; + } + send_ping(payload); } void pong(const std::string& payload) { + // TODO: do we need a lock? + if (m_state != session::state::OPEN) { + return; + } + send_pong(payload); }