loolwsd/LOOLBroker.cpp | 29 ++++++++++++++++--------- loolwsd/LOOLKit.cpp | 56 +++++++++++++++++++++++++++---------------------- 2 files changed, 50 insertions(+), 35 deletions(-)
New commits: commit da23160ed16528d464a8a6e89c66139ff26a0de9 Author: Ashod Nakashian <[email protected]> Date: Thu Dec 24 22:24:26 2015 -0500 loolwsd: misc cleanups Change-Id: I85cdd017ef5b483d34a2aa7e7a2b0c112cbf6e00 Reviewed-on: https://gerrit.libreoffice.org/20933 Reviewed-by: Ashod Nakashian <[email protected]> Tested-by: Ashod Nakashian <[email protected]> diff --git a/loolwsd/LOOLBroker.cpp b/loolwsd/LOOLBroker.cpp index 1862aa5..d2bc9fc 100644 --- a/loolwsd/LOOLBroker.cpp +++ b/loolwsd/LOOLBroker.cpp @@ -170,7 +170,7 @@ namespace cap_value_t cap_list[] = { capability }; caps = cap_get_proc(); - if (caps == NULL) + if (caps == nullptr) { Log::error("Error: cap_get_proc() failed."); exit(1); @@ -189,7 +189,7 @@ namespace exit(1); } - char *capText = cap_to_text(caps, NULL); + char *capText = cap_to_text(caps, nullptr); std::cout << Util::logPrefix() + "Capabilities now: " + capText << std::endl; cap_free(capText); @@ -255,7 +255,7 @@ public: nBytes = Util::readMessage(nPipeReader, _aBuffer, sizeof(_aBuffer)); if ( nBytes < 0 ) { - _pStart = _pEnd = NULL; + _pStart = _pEnd = nullptr; break; } @@ -303,7 +303,6 @@ public: ssize_t updateURL(Process::PID nPID, const std::string& aURL) { - std::string aResponse; std::string aMessage = "url " + aURL + "\r\n"; return sendMessage(_childProcesses[nPID], aMessage); } @@ -370,7 +369,7 @@ public: std::string aURL = tokens[2]; // check cache - auto aIterURL = _cacheURL.find(aURL); + const auto aIterURL = _cacheURL.find(aURL); if ( aIterURL != _cacheURL.end() ) { Log::debug("Cache found URL [" + aURL + "] hosted on child [" + std::to_string(aIterURL->second) + @@ -532,20 +531,22 @@ static int createLibreOfficeKit(bool sharePages, std::string loSubPath, Poco::UI Poco::UInt64 pid; if (!(pid = fork())) - { // child + { + // child run_lok_main(loSubPath, childID, ""); _exit(0); } else - { // parent + { + // parent child = pid; // (somehow - switch the hash to use real pids or ?) ... } } else { Process::Args args; - std::string executable = "loolkit"; - std::string pipe = BROKER_PREFIX + std::to_string(childCounter++) + BROKER_SUFIX; + const std::string executable = "loolkit"; + const std::string pipe = BROKER_PREFIX + std::to_string(childCounter++) + BROKER_SUFIX; if (mkfifo(pipe.c_str(), 0666) < 0) { @@ -599,6 +600,14 @@ static int startupLibreOfficeKit(bool sharePages, int nLOKits, // Broker process int main(int argc, char** argv) { + if (std::getenv("SLEEPFORDEBUGGER")) + { + std::cerr << "Sleeping " << std::getenv("SLEEPFORDEBUGGER") + << " seconds to attach debugger to process " + << Process::id() << std::endl; + Thread::sleep(std::stoul(std::getenv("SLEEPFORDEBUGGER")) * 1000); + } + // Initialization Log::initialize("brk"); @@ -611,7 +620,7 @@ int main(int argc, char** argv) for (int i = 0; i < argc; ++i) { char *cmd = argv[i]; - char *eq = NULL; + char *eq = nullptr; if (strstr(cmd, "--losubpath=") == cmd) { eq = strchrnul(cmd, '='); diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index 229eca8..9b0180e 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -251,16 +251,12 @@ FastMutex CallBackWorker::_mutex; class QueueHandler: public Runnable { public: - QueueHandler(MessageQueue& queue): - _queue(queue) + QueueHandler(MessageQueue& queue, const std::shared_ptr<LOOLSession>& session): + _queue(queue), + _session(session) { } - void setSession(std::shared_ptr<LOOLSession> session) - { - _session = session; - } - void run() override { #ifdef __linux @@ -291,8 +287,8 @@ public: } private: - std::shared_ptr<LOOLSession> _session; MessageQueue& _queue; + std::shared_ptr<LOOLSession> _session; }; class Connection: public Runnable @@ -348,10 +344,9 @@ public: _session->sendTextFrame(hello); TileQueue queue; - Thread queueHandlerThread; - QueueHandler handler(queue); + QueueHandler handler(queue, _session); - handler.setSession(_session); + Thread queueHandlerThread; queueHandlerThread.start(handler); int flags; @@ -405,11 +400,19 @@ private: void run_lok_main(const std::string &loSubPath, Poco::UInt64 _childId, const std::string& pipe) { + if (std::getenv("SLEEPFORDEBUGGER")) + { + std::cerr << "Sleeping " << std::getenv("SLEEPFORDEBUGGER") + << " seconds to attach debugger to process " + << Process::id() << std::endl; + Thread::sleep(std::stoul(std::getenv("SLEEPFORDEBUGGER")) * 1000); + } + struct pollfd aPoll; ssize_t nBytes = -1; char aBuffer[1024*2]; - char* pStart = NULL; - char* pEnd = NULL; + char* pStart = nullptr; + char* pEnd = nullptr; std::string aURL; std::map<std::string, std::shared_ptr<Connection>> _connections; @@ -422,13 +425,6 @@ void run_lok_main(const std::string &loSubPath, Poco::UInt64 _childId, const std Log::error("Cannot set thread name."); #endif - if (std::getenv("SLEEPFORDEBUGGER")) - { - std::cout << "Sleeping " << std::getenv("SLEEPFORDEBUGGER") << " seconds, attach process " - << Process::id() << " in debugger now." << std::endl; - Thread::sleep(std::stoul(std::getenv("SLEEPFORDEBUGGER")) * 1000); - } - try { #ifdef __APPLE__ @@ -550,7 +546,7 @@ void run_lok_main(const std::string &loSubPath, Poco::UInt64 _childId, const std if ( _connections.empty() ) { Log::info("Creating main thread for child: " + std::to_string(_childId) + ", thread: " + threadId); - thread = std::shared_ptr<Connection>(new Connection(loKit, NULL, _childId, threadId)); + thread = std::shared_ptr<Connection>(new Connection(loKit, nullptr, _childId, threadId)); } else { @@ -619,7 +615,7 @@ int main(int argc, char** argv) for (int i = 1; i < argc; ++i) { char *cmd = argv[i]; - char *eq = NULL; + char *eq = nullptr; if (strstr(cmd, "--losubpath=") == cmd) { eq = strchrnul(cmd, '='); commit c52a19c9bf420c157dcdb005a590cf78209bea39 Author: Ashod Nakashian <[email protected]> Date: Thu Dec 24 22:23:54 2015 -0500 loolwsd: Prevent CPU hogging when pipe breaks Change-Id: Iec42dbb64354630911a2c555ad55fd6a905db9b8 Reviewed-on: https://gerrit.libreoffice.org/20932 Reviewed-by: Ashod Nakashian <[email protected]> Tested-by: Ashod Nakashian <[email protected]> diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index b003bfb..229eca8 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -474,9 +474,13 @@ void run_lok_main(const std::string &loSubPath, Poco::UInt64 _childId, const std aPoll.events = POLLIN; aPoll.revents = 0; - (void)poll(&aPoll, 1, -1); - - if( (aPoll.revents & POLLIN) != 0 ) + if (poll(&aPoll, 1, -1) < 0) + { + Log::error("Failed to poll pipe [" + pipe + "]."); + continue; + } + else + if (aPoll.revents & POLLIN) { nBytes = Util::readFIFO(readerBroker, aBuffer, sizeof(aBuffer)); if (nBytes < 0) @@ -488,6 +492,12 @@ void run_lok_main(const std::string &loSubPath, Poco::UInt64 _childId, const std pStart = aBuffer; pEnd = aBuffer + nBytes; } + else + if (aPoll.revents & (POLLERR | POLLHUP)) + { + Log::error("Broken pipe [" + pipe + "] with broker."); + break; + } } if ( pStart != pEnd ) _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
