loolwsd/Admin.hpp | 60 +----------------------------------------- loolwsd/LOOLBroker.cpp | 70 +------------------------------------------------ loolwsd/Util.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++ loolwsd/Util.hpp | 4 ++ 4 files changed, 68 insertions(+), 126 deletions(-)
New commits: commit 190861395141587de2d15752be85b025809cd187 Author: Pranav Kant <pran...@collabora.com> Date: Tue Mar 1 23:47:34 2016 +0530 loolwsd: Factor out pipe reading polling logic Change-Id: I7c06c68031ea14147130d21376ab348bdc672a7f Reviewed-on: https://gerrit.libreoffice.org/22820 Reviewed-by: Tor Lillqvist <t...@collabora.com> Tested-by: Tor Lillqvist <t...@collabora.com> diff --git a/loolwsd/Admin.hpp b/loolwsd/Admin.hpp index 759647b..1216505 100644 --- a/loolwsd/Admin.hpp +++ b/loolwsd/Admin.hpp @@ -236,22 +236,12 @@ public: // Start a server listening on the admin port. _srv.start(); - // Start listening for data changes - std::string message; - char buffer[READ_BUFFER_SIZE]; - char* start; - char* end; - struct pollfd pollPipeNotify; - ssize_t bytes = -1; pollPipeNotify.fd = NotifyPipe; pollPipeNotify.events = POLLIN; pollPipeNotify.revents = 0; - start = buffer; - end = buffer; - static const std::string thread_name = "admin_thread"; if (prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(thread_name.c_str()), 0, 0, 0) != 0) @@ -259,55 +249,9 @@ public: Log::info("Thread [" + thread_name + "] started."); - while (!TerminationFlag) - { - if (start == end) - { - if (poll(&pollPipeNotify, 1, POLL_TIMEOUT_MS) < 0) - { - Log::error("Failed to poll pipe [" + FIFO_NOTIFY + "]."); - continue; - } - else if (pollPipeNotify.revents & (POLLIN | POLLPRI)) - { - bytes = Util::readFIFO(NotifyPipe, buffer, sizeof(buffer)); - if (bytes < 0) - { - start = end = nullptr; - Log::error("Error reading message from pipe [" + FIFO_NOTIFY + "]."); - continue; - } - start = buffer; - end = buffer + bytes; - } - else if (pollPipeNotify.revents & (POLLERR | POLLHUP)) - { - Log::error("Broken pipe [" + FIFO_NOTIFY + "] with wsd."); - break; - } - } - - if (start != end) - { - char byteChar = *start++; - while (start != end && byteChar != '\r' && byteChar != '\n') - { - message += byteChar; - byteChar = *start++; - } + Util::pollPipeForReading(pollPipeNotify, FIFO_NOTIFY, NotifyPipe, + [this](std::string& message) { return handleInput(message); } ); - if (byteChar == '\r' && *start == '\n') - { - start++; - Log::trace("NotifyData: " + message); - if (message == "eof") - break; - - handleInput(message); - message.clear(); - } - } - } Log::debug("Thread [" + thread_name + "] finished."); } diff --git a/loolwsd/LOOLBroker.cpp b/loolwsd/LOOLBroker.cpp index a9ace30..2e759cf 100644 --- a/loolwsd/LOOLBroker.cpp +++ b/loolwsd/LOOLBroker.cpp @@ -346,21 +346,12 @@ public: void run() override { - std::string message; - char buffer[READ_BUFFER_SIZE]; - char* start; - char* end; - struct pollfd pollPipeBroker; - ssize_t bytes = -1; pollPipeBroker.fd = readerBroker; pollPipeBroker.events = POLLIN; pollPipeBroker.revents = 0; - start = buffer; - end = buffer; - static const std::string thread_name = "brk_pipe_reader"; if (prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(thread_name.c_str()), 0, 0, 0) != 0) @@ -368,65 +359,8 @@ public: Log::debug("Thread [" + thread_name + "] started."); - while (!TerminationFlag) - { - if (start == end) - { - if (poll(&pollPipeBroker, 1, POLL_TIMEOUT_MS) < 0) - { - Log::error("Failed to poll pipe [" + FIFO_LOOLWSD + "]."); - continue; - } - else - if (pollPipeBroker.revents & (POLLIN | POLLPRI)) - { - bytes = Util::readFIFO(readerBroker, buffer, sizeof(buffer)); - if (bytes < 0) - { - start = end = nullptr; - Log::error("Error reading message from pipe [" + FIFO_LOOLWSD + "]."); - continue; - } - start = buffer; - end = buffer + bytes; - } - else - if (pollPipeBroker.revents & (POLLERR | POLLHUP)) - { - Log::error("Broken pipe [" + FIFO_LOOLWSD + "] with wsd."); - break; - } - } - - if (start != end) - { - char byteChar = *start++; - while (start != end && byteChar != '\r' && byteChar != '\n') - { - message += byteChar; - byteChar = *start++; - } - - if (byteChar == '\r' && *start == '\n') - { - start++; - - Log::trace("BrokerFromMaster: " + message); - if (message == "eof") - break; - - const auto duration = (std::chrono::steady_clock::now() - lastMaintenanceTime); - if (duration >= std::chrono::seconds(10)) - { - syncChildren(); - lastMaintenanceTime = std::chrono::steady_clock::now(); - } - - handleInput(message); - message.clear(); - } - } - } + Util::pollPipeForReading(pollPipeBroker, FIFO_LOOLWSD, readerBroker, + [this](std::string& message) {return handleInput(message); } ); Log::debug("Thread [" + thread_name + "] finished."); } diff --git a/loolwsd/Util.cpp b/loolwsd/Util.cpp index 5a2c864..4a7789c 100644 --- a/loolwsd/Util.cpp +++ b/loolwsd/Util.cpp @@ -544,6 +544,66 @@ namespace Util Log::warn("Exception: " + exc.message()); } } + + void pollPipeForReading(pollfd& pollPipe, const std::string& targetPipeName , const int& targetPipe, + std::function<void(std::string& message)> handler) + { + std::string message; + char buffer[READ_BUFFER_SIZE]; + char* start = buffer; + char* end = buffer; + ssize_t bytes = -1; + + while (!TerminationFlag) + { + if (start == end) + { + if (poll(&pollPipe, 1, POLL_TIMEOUT_MS) < 0) + { + Log::error("Failed to poll pipe [" + targetPipeName + "]."); + continue; + } + else if (pollPipe.revents & (POLLIN | POLLPRI)) + { + bytes = Util::readFIFO(targetPipe, buffer, sizeof(buffer)); + if (bytes < 0) + { + start = end = nullptr; + Log::error("Error reading message from pipe [" + targetPipeName + "]."); + continue; + } + start = buffer; + end = buffer + bytes; + } + else if (pollPipe.revents & (POLLERR | POLLHUP)) + { + Log::error("Broken pipe [" + targetPipeName + "] with wsd."); + break; + } + } + + if (start != end) + { + char byteChar = *start++; + while (start != end && byteChar != '\r' && byteChar != '\n') + { + message += byteChar; + byteChar = *start++; + } + + if (byteChar == '\r' && *start == '\n') + { + start++; + Log::trace(targetPipeName + " recv: " + message); + if (message == "eof") + break; + + handler(message); + message.clear(); + } + } + } + } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/loolwsd/Util.hpp b/loolwsd/Util.hpp index 0d4f5d2..b4d8251 100644 --- a/loolwsd/Util.hpp +++ b/loolwsd/Util.hpp @@ -14,6 +14,7 @@ #include <sstream> #include <functional> #include <memory> +#include <sys/poll.h> #include <Poco/File.h> #include <Poco/Path.h> @@ -122,6 +123,9 @@ namespace Util int getSignalStatus(const int code); void requestTermination(const Poco::Process::PID& pid); + + void pollPipeForReading(pollfd& pollPipe, const std::string& targetPipeName , const int& targetPipe, + std::function<void(std::string& message)> handler); }; //TODO: Move to own file. _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits