[Libreoffice-commits] online.git: kit/ChildSession.cpp kit/ChildSession.hpp kit/Kit.cpp test/WhiteBoxTests.cpp
Tor Lillqvist (via logerrit)
logerrit at kemper.freedesktop.org
Tue Apr 21 10:15:27 UTC 2020
kit/ChildSession.cpp | 2
kit/ChildSession.hpp | 2
kit/Kit.cpp | 214 +++++++++++++++++++++++++------------------------
test/WhiteBoxTests.cpp | 4
4 files changed, 117 insertions(+), 105 deletions(-)
New commits:
commit 1525f774d9317e0f40d254b1f2af98344ba79daa
Author: Tor Lillqvist <tml at collabora.com>
AuthorDate: Mon Apr 20 17:01:00 2020 +0300
Commit: Tor Lillqvist <tml at collabora.com>
CommitDate: Tue Apr 21 12:15:07 2020 +0200
tdf#128502: Get rid of the static file-level variable 'document' in Kit.cpp
It is not a problem in the multi-process web-based Online, where the
variable exists separately in each KIT process (which handles exactly
one document). But in a mobile app, when we want to be able to handle
multiple document in the single process, we can't have such variables.
Change-Id: I1d3da48316eb3a8c72ff4957cc3fcba8f6870f16
Reviewed-on: https://gerrit.libreoffice.org/c/online/+/92582
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
Reviewed-by: Tor Lillqvist <tml at collabora.com>
diff --git a/kit/ChildSession.cpp b/kit/ChildSession.cpp
index cfc7c8baa..aa9f2545c 100644
--- a/kit/ChildSession.cpp
+++ b/kit/ChildSession.cpp
@@ -1464,7 +1464,7 @@ bool ChildSession::unoCommand(const char* /*buffer*/, int /*length*/, const Stri
{
if (tokens[1] == ".uno:fakeDiskFull")
{
- Util::alertAllUsers("internal", "diskfull");
+ _docManager->alertAllUsers("internal", "diskfull");
}
else
{
diff --git a/kit/ChildSession.hpp b/kit/ChildSession.hpp
index 5cb75d702..10f3dbaf1 100644
--- a/kit/ChildSession.hpp
+++ b/kit/ChildSession.hpp
@@ -69,6 +69,8 @@ public:
virtual std::shared_ptr<TileQueue>& getTileQueue() = 0;
virtual bool sendFrame(const char* buffer, int length, WSOpCode opCode = WSOpCode::Text) = 0;
+
+ virtual void alertAllUsers(const std::string& cmd, const std::string& kind) = 0;
};
struct RecordedEvent
diff --git a/kit/Kit.cpp b/kit/Kit.cpp
index dff8f08d3..142392f6e 100644
--- a/kit/Kit.cpp
+++ b/kit/Kit.cpp
@@ -105,7 +105,6 @@ using std::size_t;
// We only host a single document in our lifetime.
class Document;
-static std::shared_ptr<Document> document;
#ifndef BUILDING_TESTS
static bool AnonymizeUserData = false;
static uint64_t AnonymizationSalt = 82589933;
@@ -1197,6 +1196,11 @@ public:
return false;
}
+ void alertAllUsers(const std::string& cmd, const std::string& kind)
+ {
+ alertAllUsers("errortoall: cmd=" + cmd + " kind=" + kind);
+ }
+
static void GlobalCallback(const int type, const char* p, void* data)
{
if (SigUtil::getTerminationFlag())
@@ -2035,6 +2039,11 @@ private:
return _obfuscatedFileId;
}
+ void alertAllUsers(const std::string& msg)
+ {
+ sendTextFrame(msg);
+ }
+
private:
std::shared_ptr<lok::Office> _loKit;
const std::string _jailId;
@@ -2091,20 +2100,106 @@ std::shared_ptr<lok::Document> getLOKDocument()
return Document::_loKitDocument;
}
+class KitSocketPoll : public SocketPoll
+{
+ std::chrono::steady_clock::time_point _pollEnd;
+ std::shared_ptr<Document> _document;
+
+public:
+ KitSocketPoll() :
+ SocketPoll("kit")
+ {
+ }
+
+ // process pending message-queue events.
+ void drainQueue(const std::chrono::steady_clock::time_point &now)
+ {
+ if (_document)
+ _document->drainQueue(now);
+ }
+
+ // called from inside poll, inside a wakeup
+ void wakeupHook()
+ {
+ _pollEnd = std::chrono::steady_clock::now();
+ }
+
+ // a LOK compatible poll function merging the functions.
+ // returns the number of events signalled
+ int kitPoll(int timeoutMicroS)
+ {
+ if (SigUtil::getTerminationFlag())
+ {
+ LOG_TRC("Termination of unipoll mainloop flagged");
+ return -1;
+ }
+
+ // The maximum number of extra events to process beyond the first.
+ int maxExtraEvents = 15;
+ int eventsSignalled = 0;
+
+
+ if (timeoutMicroS < 0)
+ {
+ // Flush at most 1 + maxExtraEvents, or return when nothing left.
+ while (poll(0) > 0 && maxExtraEvents-- > 0)
+ ++eventsSignalled;
+ }
+ else
+ {
+ // Flush at most maxEvents+1, or return when nothing left.
+ _pollEnd = std::chrono::steady_clock::now() + std::chrono::microseconds(timeoutMicroS);
+ do
+ {
+ if (poll(timeoutMicroS) <= 0)
+ break;
+
+ const auto now = std::chrono::steady_clock::now();
+ drainQueue(now);
+
+ timeoutMicroS = std::chrono::duration_cast<std::chrono::microseconds>(_pollEnd - now).count();
+ ++eventsSignalled;
+ }
+ while (timeoutMicroS > 0 && !SigUtil::getTerminationFlag() && maxExtraEvents-- > 0);
+ }
+
+ drainQueue(std::chrono::steady_clock::now());
+
+#if !MOBILEAPP
+ if (_document && _document->purgeSessions() == 0)
+ {
+ LOG_INF("Last session discarded. Setting TerminationFlag");
+ SigUtil::setTerminationFlag();
+ return -1;
+ }
+#endif
+ // Report the number of events we processed.
+ return eventsSignalled;
+ }
+
+ void setDocument(std::shared_ptr<Document> document)
+ {
+ _document = document;
+ }
+};
+
class KitWebSocketHandler final : public WebSocketHandler
{
std::shared_ptr<TileQueue> _queue;
std::string _socketName;
std::shared_ptr<lok::Office> _loKit;
std::string _jailId;
+ std::shared_ptr<Document> _document;
+ KitSocketPoll &_ksPoll;
public:
- KitWebSocketHandler(const std::string& socketName, const std::shared_ptr<lok::Office>& loKit, const std::string& jailId) :
+ KitWebSocketHandler(const std::string& socketName, const std::shared_ptr<lok::Office>& loKit, const std::string& jailId, KitSocketPoll& ksPoll) :
WebSocketHandler(/* isClient = */ true, /* isMasking */ false),
_queue(std::make_shared<TileQueue>()),
_socketName(socketName),
_loKit(loKit),
- _jailId(jailId)
+ _jailId(jailId),
+ _ksPoll(ksPoll)
{
}
@@ -2155,13 +2250,16 @@ protected:
LOG_INF("New session [" << sessionId << "] request on url [" << url << "].");
Util::setThreadName("kit_" + docId);
- if (!document)
- document = std::make_shared<Document>(
+ if (!_document)
+ {
+ _document = std::make_shared<Document>(
_loKit, _jailId, docKey, docId, url, _queue,
std::static_pointer_cast<WebSocketHandler>(shared_from_this()));
+ _ksPoll.setDocument(_document);
+ }
// Validate and create session.
- if (!(url == document->getUrl() && document->createSession(sessionId)))
+ if (!(url == _document->getUrl() && _document->createSession(sessionId)))
{
LOG_DBG("CreateSession failed.");
}
@@ -2176,14 +2274,14 @@ protected:
#else
LOG_INF("Setting TerminationFlag due to 'exit' command.");
SigUtil::setTerminationFlag();
- document.reset();
+ _document.reset();
#endif
}
else if (tokens.equals(0, "tile") || tokens.equals(0, "tilecombine") || tokens.equals(0, "canceltiles") ||
tokens.equals(0, "paintwindow") || tokens.equals(0, "resizewindow") ||
LOOLProtocol::getFirstToken(tokens[0], '-') == "child")
{
- if (document)
+ if (_document)
{
_queue->put(message);
}
@@ -2222,82 +2320,6 @@ void documentViewCallback(const int type, const char* payload, void* data)
Document::ViewCallback(type, payload, data);
}
-class KitSocketPoll : public SocketPoll
-{
- std::chrono::steady_clock::time_point _pollEnd;
-public:
- KitSocketPoll() :
- SocketPoll("kit")
- {
- }
-
- // process pending message-queue events.
- void drainQueue(const std::chrono::steady_clock::time_point &now)
- {
- if (document)
- document->drainQueue(now);
- }
-
- // called from inside poll, inside a wakeup
- void wakeupHook()
- {
- _pollEnd = std::chrono::steady_clock::now();
- }
-
- // a LOK compatible poll function merging the functions.
- // returns the number of events signalled
- int kitPoll(int timeoutMicroS)
- {
- if (SigUtil::getTerminationFlag())
- {
- LOG_TRC("Termination of unipoll mainloop flagged");
- return -1;
- }
-
- // The maximum number of extra events to process beyond the first.
- int maxExtraEvents = 15;
- int eventsSignalled = 0;
-
-
- if (timeoutMicroS < 0)
- {
- // Flush at most 1 + maxExtraEvents, or return when nothing left.
- while (poll(0) > 0 && maxExtraEvents-- > 0)
- ++eventsSignalled;
- }
- else
- {
- // Flush at most maxEvents+1, or return when nothing left.
- _pollEnd = std::chrono::steady_clock::now() + std::chrono::microseconds(timeoutMicroS);
- do
- {
- if (poll(timeoutMicroS) <= 0)
- break;
-
- const auto now = std::chrono::steady_clock::now();
- drainQueue(now);
-
- timeoutMicroS = std::chrono::duration_cast<std::chrono::microseconds>(_pollEnd - now).count();
- ++eventsSignalled;
- }
- while (timeoutMicroS > 0 && !SigUtil::getTerminationFlag() && maxExtraEvents-- > 0);
- }
-
- drainQueue(std::chrono::steady_clock::now());
-
-#if !MOBILEAPP
- if (document && document->purgeSessions() == 0)
- {
- LOG_INF("Last session discarded. Setting TerminationFlag");
- SigUtil::setTerminationFlag();
- return -1;
- }
-#endif
- // Report the number of events we processed.
- return eventsSignalled;
- }
-};
-
/// Called by LOK main-loop the central location for data processing.
int pollCallback(void* pData, int timeoutUs)
{
@@ -2660,8 +2682,9 @@ void lokit_main(
KitSocketPoll mainKit;
mainKit.runOnClientThread(); // We will do the polling on this thread.
- std::shared_ptr<ProtocolHandlerInterface> websocketHandler =
- std::make_shared<KitWebSocketHandler>("child_ws", loKit, jailId);
+ std::shared_ptr<KitWebSocketHandler> websocketHandler =
+ std::make_shared<KitWebSocketHandler>("child_ws", loKit, jailId, mainKit);
+
#if !MOBILEAPP
mainKit.insertNewUnixSocket(MasterLocation, pathAndQuery, websocketHandler);
#else
@@ -2827,23 +2850,6 @@ std::string anonymizeUsername(const std::string& username)
#endif
}
-#if !defined(BUILDING_TESTS) && !defined(KIT_IN_PROCESS)
-namespace Util
-{
-
-void alertAllUsers(const std::string& msg)
-{
- document->sendTextFrame(msg);
-}
-
-void alertAllUsers(const std::string& cmd, const std::string& kind)
-{
- alertAllUsers("errortoall: cmd=" + cmd + " kind=" + kind);
-}
-
-}
-#endif
-
-#endif // MOBILEAPP
+#endif // !MOBILEAPP
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/test/WhiteBoxTests.cpp b/test/WhiteBoxTests.cpp
index 12112d120..66f3e895f 100644
--- a/test/WhiteBoxTests.cpp
+++ b/test/WhiteBoxTests.cpp
@@ -561,6 +561,10 @@ public:
{
return true;
}
+
+ void alertAllUsers(const std::string& /*cmd*/, const std::string& /*kind*/) override
+ {
+ }
};
void WhiteBoxTests::testEmptyCellCursor()
More information about the Libreoffice-commits
mailing list