[Libreoffice-commits] online.git: wsd/DocumentBroker.cpp wsd/DocumentBroker.hpp wsd/LOOLWSD.cpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Sun Apr 2 04:48:10 UTC 2017
wsd/DocumentBroker.cpp | 28 ++--------------------------
wsd/DocumentBroker.hpp | 9 ++-------
wsd/LOOLWSD.cpp | 47 +++++++++++++++++++++++++++++------------------
3 files changed, 33 insertions(+), 51 deletions(-)
New commits:
commit 63ab3bcfa49ec9f6efb0fa81657ea64eaf0ab007
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Sat Apr 1 19:20:54 2017 -0400
wsd: remove queueSession and simplify session loading
Change-Id: Ia03a4ed64b743da8fa7e27de853623126698b9c0
Reviewed-on: https://gerrit.libreoffice.org/36016
Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
Tested-by: Ashod Nakashian <ashnakash at gmail.com>
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index 0a6d2f01..494f21f3 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -223,22 +223,6 @@ void DocumentBroker::pollThread()
// Main polling loop goodness.
while (!_stop && _poll->continuePolling() && !TerminationFlag && !ShutdownRequestFlag)
{
- // First, load new sessions.
- for (const auto& pair : _sessions)
- {
- try
- {
- auto& session = pair.second;
- if (!session->isAttached())
- addSession(session);
- }
- catch (const std::exception& exc)
- {
- LOG_ERR("Error while adding new session to doc [" << _docKey << "]: " << exc.what());
- //TODO: Send failure to client and remove session.
- }
- }
-
_poll->poll(SocketPoll::DefaultPollTimeoutMs);
if (!std::getenv("LOOL_NO_AUTOSAVE") && !_stop &&
@@ -746,16 +730,6 @@ std::string DocumentBroker::getJailRoot() const
return Poco::Path(_childRoot, _jailId).toString();
}
-size_t DocumentBroker::queueSession(std::shared_ptr<ClientSession>& session)
-{
- std::unique_lock<std::mutex> lock(_mutex);
-
- _sessions.emplace(session->getId(), session);
- _poll->wakeup();
-
- return _sessions.size();
-}
-
size_t DocumentBroker::addSession(const std::shared_ptr<ClientSession>& session)
{
assert(isCorrectThread());
@@ -788,6 +762,8 @@ size_t DocumentBroker::addSession(const std::shared_ptr<ClientSession>& session)
_markToDestroy = false;
_stop = false;
+ // Add and attach the session.
+ _sessions.emplace(session->getId(), session);
session->setAttached();
const auto id = session->getId();
diff --git a/wsd/DocumentBroker.hpp b/wsd/DocumentBroker.hpp
index a7473531..915db5a6 100644
--- a/wsd/DocumentBroker.hpp
+++ b/wsd/DocumentBroker.hpp
@@ -266,10 +266,8 @@ public:
std::string getJailRoot() const;
- /// Queue a new session to be attached asynchronously.
- /// @return amount of session we have after all the queued ones will be
- /// created.
- size_t queueSession(std::shared_ptr<ClientSession>& session);
+ /// Add a new session. Returns the new number of sessions.
+ size_t addSession(const std::shared_ptr<ClientSession>& session);
/// Removes a session by ID. Returns the new number of sessions.
size_t removeSession(const std::string& id, bool destroyIfLast = false);
@@ -354,9 +352,6 @@ private:
/// Forward a message from child session to its respective client session.
bool forwardToClient(const std::shared_ptr<Message>& payload);
- /// Add a new session. Returns the new number of sessions.
- size_t addSession(const std::shared_ptr<ClientSession>& session);
-
/// The thread function that all of the I/O for all sessions
/// associated with this document.
void pollThread();
diff --git a/wsd/LOOLWSD.cpp b/wsd/LOOLWSD.cpp
index db5f55a2..05c6e1da 100644
--- a/wsd/LOOLWSD.cpp
+++ b/wsd/LOOLWSD.cpp
@@ -1324,8 +1324,6 @@ static std::shared_ptr<ClientSession> createNewClientSession(const WebSocketHand
// (UserCanWrite param).
auto session = std::make_shared<ClientSession>(id, docBroker, uriPublic, isReadOnly);
- docBroker->queueSession(session);
-
return session;
}
catch (const std::exception& exc)
@@ -1860,17 +1858,18 @@ private:
auto clientSession = createNewClientSession(nullptr, _id, uriPublic, docBroker, isReadOnly);
if (clientSession)
{
+ clientSession->setSaveAsSocket(socket);
+
// Transfer the client socket to the DocumentBroker.
// Move the socket into DocBroker.
docBroker->addSocketToPoll(socket);
socketOwnership = SocketHandlerInterface::SocketOwnership::MOVED;
- clientSession->setSaveAsSocket(socket);
-
- docBroker->startThread();
-
- docBroker->addCallback([&]()
+ docBroker->addCallback([&, clientSession]()
{
+ // First add and load the session.
+ docBroker->addSession(clientSession);
+
// Load the document manually and request saving in the target format.
std::string encodedFrom;
URI::encode(docBroker->getPublicUri().getPath(), "", encodedFrom);
@@ -1891,6 +1890,8 @@ private:
clientSession->handleMessage(true, WebSocketHandler::WSOpCode::Text, saveasRequest);
});
+ docBroker->startThread();
+
sent = true;
}
else
@@ -2026,8 +2027,14 @@ private:
SocketHandlerInterface::SocketOwnership handleClientWsUpgrade(const Poco::Net::HTTPRequest& request, const std::string& url)
{
- // requestHandler = new ClientRequestHandler();
- LOG_INF("Client WS request: " << request.getURI() << ", url: " << url);
+ auto socket = _socket.lock();
+ if (!socket)
+ {
+ LOG_WRN("No socket to handle client WS upgrade for request: " << request.getURI() << ", url: " << url);
+ return SocketHandlerInterface::SocketOwnership::UNCHANGED;
+ }
+
+ LOG_INF("Client WS request: " << request.getURI() << ", url: " << url << ", socket #" << socket->getFD());
// First Upgrade.
WebSocketHandler ws(_socket, request);
@@ -2074,17 +2081,21 @@ private:
if (clientSession)
{
// Transfer the client socket to the DocumentBroker.
- auto socket = _socket.lock();
- if (socket)
+
+ // Set the ClientSession to handle Socket events.
+ socket->setHandler(clientSession);
+ LOG_DBG("Socket #" << socket->getFD() << " handler is " << clientSession->getName());
+
+ // Move the socket into DocBroker.
+ docBroker->addSocketToPoll(socket);
+ socketOwnership = SocketHandlerInterface::SocketOwnership::MOVED;
+
+ docBroker->addCallback([docBroker, clientSession]()
{
- // Set the ClientSession to handle Socket events.
- socket->setHandler(clientSession);
- LOG_DBG("Socket #" << socket->getFD() << " handler is " << clientSession->getName());
+ // Add and load the session.
+ docBroker->addSession(clientSession);
+ });
- // Move the socket into DocBroker.
- docBroker->addSocketToPoll(socket);
- socketOwnership = SocketHandlerInterface::SocketOwnership::MOVED;
- }
docBroker->startThread();
}
else
More information about the Libreoffice-commits
mailing list