net/Socket.hpp | 1 - wsd/DocumentBroker.cpp | 5 +++++ wsd/DocumentBroker.hpp | 8 ++++---- wsd/LOOLWSD.cpp | 6 +++++- 4 files changed, 14 insertions(+), 6 deletions(-)
New commits: commit 97e9463f173c833ce9d4b0503ea865ebd70a7a33 Author: Michael Meeks <michael.me...@collabora.com> Date: Mon Mar 13 12:00:31 2017 +0000 Revert "wsd: TerminatingPoll always starts its own thread" This reverts commit 388d7b1dbf1a5c2d155c0149247b3a319114f8b0. It is vital to have clean control of thread start. By starting a thread during init. of a member (or base-clase) we loose lots of control, some examples: Any members initialized after a member that auto-starts a thread, is effectively un-defined, and cannot be accessed reliably. This is particularly problematic for sub-classes. I've seen threads started before the base-class has finished constructing in the original creating thread - such that the vtable was not yet updated to the sub-class causing the transient parent vtable used during construction to be used in-error. diff --git a/net/Socket.hpp b/net/Socket.hpp index 5cced5f..16c0cdc 100644 --- a/net/Socket.hpp +++ b/net/Socket.hpp @@ -435,7 +435,6 @@ public: const std::string& name() const { return _name; } -protected: /// Start the polling thread (if desired) void startThread(); diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp index a53a7c1..04fe5ac 100644 --- a/wsd/DocumentBroker.cpp +++ b/wsd/DocumentBroker.cpp @@ -162,6 +162,11 @@ DocumentBroker::DocumentBroker(const std::string& uri, LOG_INF("DocumentBroker [" << _uriPublic.toString() << "] created. DocKey: [" << _docKey << "]"); } +void DocumentBroker::startThread() +{ + _poll->startThread(); +} + // The inner heart of the DocumentBroker - our poll loop. void DocumentBroker::pollThread() { diff --git a/wsd/DocumentBroker.hpp b/wsd/DocumentBroker.hpp index 8d7eb2a..8d36cb2 100644 --- a/wsd/DocumentBroker.hpp +++ b/wsd/DocumentBroker.hpp @@ -44,10 +44,7 @@ class TerminatingPoll : public SocketPoll { public: TerminatingPoll(const std::string &threadName) : - SocketPoll(threadName) - { - startThread(); - } + SocketPoll(threadName) {} bool continuePolling() override { @@ -221,6 +218,9 @@ public: ~DocumentBroker(); + /// Start processing events + void startThread(); + /// Loads a document from the public URI into the jail. bool load(std::shared_ptr<ClientSession>& session, const std::string& jailId); bool isLoaded() const { return _isLoaded; } diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp index 97cf845..b4d42ab 100644 --- a/wsd/LOOLWSD.cpp +++ b/wsd/LOOLWSD.cpp @@ -2177,6 +2177,7 @@ private: void handleClientWsUpgrade(const Poco::Net::HTTPRequest& request, const std::string& url) { + // requestHandler = new ClientRequestHandler(); LOG_INF("Client WS request" << request.getURI() << ", url: " << url); // First Upgrade. @@ -2230,9 +2231,9 @@ private: _clientSession->onConnect(socket); docBroker->addSocketToPoll(socket); } + docBroker->startThread(); } } - if (!docBroker || !_clientSession) LOG_WRN("Failed to connect DocBroker and Client Session."); } @@ -2358,11 +2359,14 @@ public: void startPrisoners(const int port) { PrisonerPoll.insertNewSocket(findPrisonerServerPort(port)); + PrisonerPoll.startThread(); } void start(const int port) { _acceptPoll.insertNewSocket(findServerPort(port)); + _acceptPoll.startThread(); + WebServerPoll.startThread(); } void stop() _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits