From 16c8bebf44b8c92d6180b19ebc818f8bcca45232 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 10 Dec 2012 14:27:43 -0800 Subject: [PATCH] Workaround websocketpp's bad exception logic. --- src/cpp/ripple/WSDoor.cpp | 50 ++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/src/cpp/ripple/WSDoor.cpp b/src/cpp/ripple/WSDoor.cpp index f5327a486..4213487cd 100644 --- a/src/cpp/ripple/WSDoor.cpp +++ b/src/cpp/ripple/WSDoor.cpp @@ -66,9 +66,28 @@ void WSDoor::startListening() // mEndpoint->elog().unset_level(websocketpp::log::elevel::ALL); // Call the main-event-loop of the websocket server. - mSEndpoint->listen( - boost::asio::ip::tcp::endpoint( - boost::asio::ip::address().from_string(mIp), mPort)); + try + { + mSEndpoint->listen( + boost::asio::ip::tcp::endpoint( + boost::asio::ip::address().from_string(mIp), mPort)); + } + catch (websocketpp::exception& e) + { + Log(lsWARNING) << "websocketpp exception: " << e.what(); + while (1) // temporary workaround for websocketpp throwing exceptions on access/close races + { // https://github.com/zaphoyd/websocketpp/issues/98 + try + { + mSEndpoint->get_io_service().run(); + break; + } + catch (websocketpp::exception& e) + { + Log(lsWARNING) << "websocketpp exception: " << e.what(); + } + } + } delete mSEndpoint; }else @@ -83,9 +102,28 @@ void WSDoor::startListening() // mEndpoint->elog().unset_level(websocketpp::log::elevel::ALL); // Call the main-event-loop of the websocket server. - mEndpoint->listen( - boost::asio::ip::tcp::endpoint( - boost::asio::ip::address().from_string(mIp), mPort)); + try + { + mEndpoint->listen( + boost::asio::ip::tcp::endpoint( + boost::asio::ip::address().from_string(mIp), mPort)); + } + catch (websocketpp::exception& e) + { + Log(lsWARNING) << "websocketpp exception: " << e.what(); + while (1) // temporary workaround for websocketpp throwing exceptions on access/close races + { // https://github.com/zaphoyd/websocketpp/issues/98 + try + { + mEndpoint->get_io_service().run(); + break; + } + catch (websocketpp::exception& e) + { + Log(lsWARNING) << "websocketpp exception: " << e.what(); + } + } + } delete mEndpoint; }