loolwsd/IoUtil.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ loolwsd/IoUtil.hpp | 8 +++++++ loolwsd/LOOLBroker.cpp | 22 ++----------------- 3 files changed, 66 insertions(+), 19 deletions(-)
New commits: commit 7f0996ad04697f54a4c5de00231e7e13c5f72b71 Author: Henry Castro <[email protected]> Date: Sun Apr 3 16:12:52 2016 -0400 loolwsd: use SocketProcessor diff --git a/loolwsd/IoUtil.cpp b/loolwsd/IoUtil.cpp index ec07bb3..f01634f 100644 --- a/loolwsd/IoUtil.cpp +++ b/loolwsd/IoUtil.cpp @@ -192,6 +192,60 @@ void SocketProcessor(std::shared_ptr<WebSocket> ws, Log::info(name + "Finished Socket Processor."); } +// Synchronously process DialogSocket requests and dispatch to handler. +// Handler returns false to end. +void SocketProcessor(std::shared_ptr<Poco::Net::DialogSocket> ds, + std::function<bool(std::string&)> handler, + std::function<bool()> stopPredicate, + std::string name, + const size_t pollTimeoutMs) +{ + Log::info(name + "Starting Socket Processor."); + + // Timeout given is in microseconds. + const Poco::Timespan waitTime(pollTimeoutMs * 1000); + try + { + bool stop = false; + + for (;;) + { + stop = stopPredicate(); + if (stop) + { + Log::info(name + "Termination flagged. Finishing."); + break; + } + + if (!ds->poll(waitTime, Poco::Net::Socket::SELECT_READ)) + { + // Wait some more. + continue; + } + + std::string message; + ds->receiveMessage(message); + // Call the handler. + if (!handler(message)) + { + Log::info(name + "Socket handler flagged to finish."); + break; + } + } + + Log::debug() << name << "Finishing SocketProcessor. TerminationFlag: " << stop << Log::end; + } + catch (const Poco::Exception& exc) + { + Log::error() << "CommandRunnable::run: Exception: " << exc.displayText() + << (exc.nested() ? " (" + exc.nested()->displayText() + ")" : "") + << Log::end; + } + + Log::info(name + "Finished Socket Processor."); +} + + void shutdownWebSocket(std::shared_ptr<Poco::Net::WebSocket> ws) { try @@ -302,6 +356,7 @@ int PipeReader::readLine(std::string& line, pipe.events = POLLIN; pipe.revents = 0; const int ready = poll(&pipe, 1, pollTimeoutMs); + if (ready == 0) { // Timeout. diff --git a/loolwsd/IoUtil.hpp b/loolwsd/IoUtil.hpp index 016a808..96ac5bd 100644 --- a/loolwsd/IoUtil.hpp +++ b/loolwsd/IoUtil.hpp @@ -17,6 +17,7 @@ #include <sys/poll.h> #include <Poco/Net/WebSocket.h> +#include <Poco/Net/DialogSocket.h> #include <Poco/Logger.h> namespace IoUtil @@ -30,6 +31,13 @@ namespace IoUtil std::string name = std::string(), const size_t pollTimeoutMs = POLL_TIMEOUT_MS); + void SocketProcessor(std::shared_ptr<Poco::Net::DialogSocket> ds, + std::function<bool(std::string&)> handler, + std::function<bool()> stopPredicate, + std::string name = std::string(), + const size_t pollTimeoutMs = POLL_TIMEOUT_MS); + + /// Call WebSocket::shutdown() ignoring Poco::IOException. void shutdownWebSocket(std::shared_ptr<Poco::Net::WebSocket> ws); diff --git a/loolwsd/LOOLBroker.cpp b/loolwsd/LOOLBroker.cpp index 5013736..4da203b 100644 --- a/loolwsd/LOOLBroker.cpp +++ b/loolwsd/LOOLBroker.cpp @@ -261,25 +261,9 @@ public: Log::debug("Thread [" + thread_name + "] started."); - try - { - while (!TerminationFlag) - { - if (_dlgWsd->poll(waitTime, Socket::SELECT_READ)) - { - std::string message; - _dlgWsd->receiveMessage(message); - handleInput(message); - } - } - _dlgWsd->shutdown(); - } - catch (const Exception& exc) - { - Log::error() << "CommandRunnable::run: Exception: " << exc.displayText() - << (exc.nested() ? " (" + exc.nested()->displayText() + ")" : "") - << Log::end; - } + IoUtil::SocketProcessor(_dlgWsd, + [this](std::string& message) { handleInput(message); return true; }, + []() { return TerminationFlag; }); Log::debug("Thread [" + thread_name + "] finished."); } _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
