loolwsd/LOOLKit.cpp | 69 +++++++++++++++++----------------------------------- 1 file changed, 23 insertions(+), 46 deletions(-)
New commits: commit 4305d333b23102c0f9d88bb083cad5c25825e162 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Sun Mar 27 19:44:21 2016 -0400 loolwsd: lokit process can only host one url in its lifetime Change-Id: I561e5b81a748b7ec567af9aff968ba5c66ad44bf Reviewed-on: https://gerrit.libreoffice.org/23639 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index 9d9dbc5..eb8a683 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -793,21 +793,14 @@ void lokit_main(const std::string& childRoot, Util::rng::reseed(); #endif - struct pollfd pollPipeBroker; - ssize_t bytes = -1; - int ready = 0; - bool isUsedKit = false; - char buffer[READ_BUFFER_SIZE]; - char* start = nullptr; - char* end = nullptr; - assert(!childRoot.empty()); assert(!sysTemplate.empty()); assert(!loTemplate.empty()); assert(!loSubPath.empty()); assert(!pipe.empty()); - std::map<std::string, std::shared_ptr<Document>> _documents; + // We only host a single document in our lifetime. + std::shared_ptr<Document> document; // Ideally this will be a random ID, but broker will cleanup // our jail directory when we die, and it's simpler to know @@ -939,27 +932,23 @@ void lokit_main(const std::string& childRoot, Log::info("loolkit [" + std::to_string(Process::id()) + "] is ready."); - std::string response; - std::string message; + char* start = nullptr; + char* end = nullptr; while (!TerminationFlag) { if (start == end) { + struct pollfd pollPipeBroker; pollPipeBroker.fd = readerBroker; pollPipeBroker.events = POLLIN; pollPipeBroker.revents = 0; - ready = poll(&pollPipeBroker, 1, POLL_TIMEOUT_MS); + const int ready = poll(&pollPipeBroker, 1, POLL_TIMEOUT_MS); if (ready == 0) { // time out maintenance - for (auto it = _documents.cbegin(); it != _documents.cend(); ) - { - it = (it->second->canDiscard() ? _documents.erase(it) : ++it); - } - - if (isUsedKit && _documents.empty()) + if (document && document->canDiscard()) { Log::info("Document closed. Flagging for termination."); TerminationFlag = true; @@ -974,7 +963,8 @@ void lokit_main(const std::string& childRoot, else if (pollPipeBroker.revents & (POLLIN | POLLPRI)) { - bytes = IoUtil::readFIFO(readerBroker, buffer, sizeof(buffer)); + char buffer[READ_BUFFER_SIZE]; + const auto bytes = IoUtil::readFIFO(readerBroker, buffer, sizeof(buffer)); if (bytes < 0) { start = end = nullptr; @@ -994,6 +984,7 @@ void lokit_main(const std::string& childRoot, if (start != end) { + std::string message; char byteChar = *start++; while (start != end && byteChar != '\r' && byteChar != '\n') { @@ -1004,17 +995,11 @@ void lokit_main(const std::string& childRoot, if (byteChar == '\r' && *start == '\n') { start++; - StringTokenizer tokens(message, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); - response = std::to_string(Process::id()) + " "; - Log::trace("Recv: " + message); + StringTokenizer tokens(message, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); + auto response = std::to_string(Process::id()) + " "; - for (auto it = _documents.cbegin(); it != _documents.cend(); ) - { - it = (it->second->canDiscard() ? _documents.erase(it) : ++it); - } - - if (TerminationFlag || (isUsedKit && _documents.empty())) + if (TerminationFlag || (document && document->canDiscard())) { TerminationFlag = true; response += "down \r\n"; @@ -1023,15 +1008,8 @@ void lokit_main(const std::string& childRoot, { if (tokens[1] == "url") { - if (_documents.empty()) - { - response += "empty \r\n"; - } - else - { - // We really only support single URL hosting. - response += _documents.cbegin()->first + "\r\n"; - } + response += (document ? document->getUrl() : "empty"); + response += " \r\n"; } } else if (tokens[0] == "thread") @@ -1042,15 +1020,14 @@ void lokit_main(const std::string& childRoot, std::string url; Poco::URI::decode(docKey, url); - Log::debug("Thread request for session [" + sessionId + "], url: [" + url + "]."); - auto it = _documents.lower_bound(url); - if (it == _documents.end()) + Log::info("Thread request for session [" + sessionId + "], url: [" + url + "]."); + + if (!document) { - it = _documents.emplace_hint(it, url, std::make_shared<Document>(loKit, jailId, docKey, url)); + document = std::make_shared<Document>(loKit, jailId, docKey, url); } - it->second->createSession(sessionId, intSessionId); - isUsedKit = true; + document->createSession(sessionId, intSessionId); response += "ok \r\n"; } else @@ -1084,10 +1061,10 @@ void lokit_main(const std::string& childRoot, Log::error(std::string("Exception: ") + exc.what()); } - if (!_documents.empty()) + if (document) { - Log::debug("Destroying documents."); - _documents.clear(); + Log::info("Destroying document [" + document->getUrl() + "]."); + document.reset(); } // Destroy LibreOfficeKit _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits