common/MessageQueue.hpp | 9 ++++++ kit/Kit.cpp | 66 +++++++++++++++++++++--------------------------- kit/TestStubs.cpp | 21 +++++++++++++++ test/Makefile.am | 2 + 4 files changed, 62 insertions(+), 36 deletions(-)
New commits: commit 956f8bf5e8689b72a4e40eed1a6b716ab270323a Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Fri May 3 17:05:52 2019 +0100 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Fri May 10 14:43:27 2019 +0100 Unipoll: move event processing into the same thread. Change-Id: I15aff3b5f18201eca915da94dbaa05148026e244 diff --git a/common/MessageQueue.hpp b/common/MessageQueue.hpp index 74acc7ea8..ac8d4e51f 100644 --- a/common/MessageQueue.hpp +++ b/common/MessageQueue.hpp @@ -79,6 +79,15 @@ public: return get_impl(); } + /// Get a message without waiting + Payload pop() + { + std::unique_lock<std::mutex> lock(_mutex); + if (!_queue.size()) + return Payload(); + return get_impl(); + } + /// Thread safe removal of all the pending messages. void clear() { diff --git a/kit/Kit.cpp b/kit/Kit.cpp index c6ab8fd4a..6ac59e84d 100644 --- a/kit/Kit.cpp +++ b/kit/Kit.cpp @@ -858,7 +858,7 @@ public: /// per process. But for security reasons don't. /// However, we could have a loolkit instance /// per user or group of users (a trusted circle). -class Document : public Runnable, public DocumentManagerInterface +class Document : public DocumentManagerInterface { public: /// We have two types of password protected documents @@ -898,7 +898,10 @@ public: "] and id [" << _docId << "]."); assert(_loKit); - _callbackThread.start(*this); +#if !MOBILEAPP + _lastMemStatsTime = std::chrono::steady_clock::now(); + sendTextFrame(Util::getMemoryStats(ProcSMapsFile)); +#endif } ~Document() @@ -912,12 +915,11 @@ public: _stop = true; _tileQueue->put("eof"); - _callbackThread.join(); } const std::string& getUrl() const { return _url; } - /// Post the message in the correct thread. + /// Post the message - in the unipoll world we're in the right thread anyway bool postMessage(const std::shared_ptr<std::vector<char>>& message, const WSOpCode code) const { LOG_TRC("postMessage called with: " << getAbbreviatedMessage(message->data(), message->size())); @@ -927,9 +929,7 @@ public: return false; } - _socketPoll.addCallback([=]{ - _websocketHandler->sendMessage(message->data(), message->size(), code); - }); + _websocketHandler->sendMessage(message->data(), message->size(), code); return true; } @@ -1982,35 +1982,16 @@ private: return std::string(); } - void run() override +public: + void drainQueue(const std::chrono::steady_clock::time_point &now) { - Util::setThreadName("lokit_" + _docId); - - LOG_DBG("Thread started."); -#if !MOBILEAPP - // Update memory stats and editor every 5 seconds. - const int memStatsPeriodMs = 5000; - auto lastMemStatsTime = std::chrono::steady_clock::now(); - sendTextFrame(Util::getMemoryStats(ProcSMapsFile)); -#endif try { - while (!_stop && !TerminationFlag) + while (true) { - const TileQueue::Payload input = _tileQueue->get(POLL_TIMEOUT_MS * 2); - if (input.empty()) - { -#if !MOBILEAPP - auto duration = (std::chrono::steady_clock::now() - lastMemStatsTime); - std::chrono::milliseconds::rep durationMs = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count(); - if (durationMs > memStatsPeriodMs) - { - sendTextFrame(Util::getMemoryStats(ProcSMapsFile)); - lastMemStatsTime = std::chrono::steady_clock::now(); - } -#endif - continue; - } + const TileQueue::Payload input = _tileQueue->pop(); + if (input.size() <= 0) + break; LOG_TRC("Kit Recv " << LOOLProtocol::getAbbreviatedMessage(input)); @@ -2113,6 +2094,17 @@ private: LOG_ERR("Unexpected request: [" << LOOLProtocol::getAbbreviatedMessage(input) << "]."); } } + +#if !MOBILEAPP + std::chrono::milliseconds::rep durationMs = + std::chrono::duration_cast<std::chrono::milliseconds>(now - _lastMemStatsTime).count(); + // Update memory stats and editor every 5 seconds. + if (durationMs > 5000) + { + sendTextFrame(Util::getMemoryStats(ProcSMapsFile)); + _lastMemStatsTime = std::chrono::steady_clock::now(); + } +#endif } catch (const std::exception& exc) { @@ -2122,10 +2114,9 @@ private: { LOG_FTL("QueueHandler::run: Unknown exception"); } - - LOG_DBG("Thread finished."); } +private: /// Return access to the lok::Office instance. std::shared_ptr<lok::Office> getLOKit() override { @@ -2207,6 +2198,7 @@ private: std::map<int, int> _speedCount; /// For showing disconnected user info in the doc repair dialog. std::map<int, UserInfo> _sessionUserInfo; + std::chrono::steady_clock::time_point _lastMemStatsTime; Poco::Thread _callbackThread; }; @@ -2277,7 +2269,6 @@ protected: if (!document) { - // Creating the Document object starts a thread running Document::run(). document = std::make_shared<Document>(_loKit, _jailId, docKey, docId, url, _queue, _socketPoll, shared_from_this()); } @@ -2336,7 +2327,7 @@ void documentViewCallback(const int type, const char* payload, void* data) Document::ViewCallback(type, payload, data); } -/// Called by LOK main-loop +/// Called by LOK main-loop the central location for data processing. int pollCallback(void* pData, int timeoutUs) { if (!pData) @@ -2379,6 +2370,9 @@ int pollCallback(void* pData, int timeoutUs) while (maxExtraEvents-- > 0); } + if (document) + document->drainQueue(std::chrono::steady_clock::now()); + #if !MOBILEAPP if (document && document->purgeSessions() == 0) { diff --git a/kit/TestStubs.cpp b/kit/TestStubs.cpp new file mode 100644 index 000000000..0cb32a091 --- /dev/null +++ b/kit/TestStubs.cpp @@ -0,0 +1,21 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/* + * Stub missing symbols required for unit tests ... + */ + +#include <config.h> + +#include "common/Common.hpp" +#include "ChildSession.hpp" + +void ChildSession::loKitCallback(const int /* type */, const std::string& /* payload */) {} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/test/Makefile.am b/test/Makefile.am index 2683bce16..bd107629e 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -43,10 +43,12 @@ wsd_sources = \ ../common/Log.cpp \ ../common/Protocol.cpp \ ../common/Session.cpp \ + ../common/SpookyV2.cpp \ ../common/Util.cpp \ ../common/MessageQueue.cpp \ ../common/Authorization.cpp \ ../kit/Kit.cpp \ + ../kit/TestStubs.cpp \ ../wsd/Auth.cpp \ ../wsd/TileCache.cpp \ ../wsd/TestStubs.cpp \ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits