loolwsd/LOOLWSD.cpp | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)
New commits: commit 70690f6dabffd1ffb5aff8e01349371700b940e1 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Sun Oct 23 15:59:22 2016 -0400 loolwsd: remove dead DocumentBrokers Change-Id: If9b24ac1e45454e21222699a00defa70acc4ed80 Reviewed-on: https://gerrit.libreoffice.org/30212 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index a9aa59d..a287320 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -224,6 +224,30 @@ void shutdownLimitReached(WebSocket& ws) } +/// Remove dead DocBrokers. +/// Returns true if at least one is removed. +bool cleanupDocBrokers() +{ + Util::assertIsLocked(DocBrokersMutex); + + const auto count = DocBrokers.size(); + for (auto it = DocBrokers.begin(); it != DocBrokers.end(); ) + { + // Cleanup used and dead entries. + if (it->second->isLoaded() && !it->second->isAlive()) + { + Log::debug("Removing dead DocBroker [" + it->first + "]."); + it = DocBrokers.erase(it); + } + else + { + ++it; + } + } + + return (count != DocBrokers.size()); +} + static void forkChildren(const int number) { Util::assertIsLocked(NewChildrenMutex); @@ -273,6 +297,14 @@ static void preForkChildren() /// to load documents with alacrity. static void prespawnChildren() { + // First remove dead DocBrokers, if possible. + std::unique_lock<std::mutex> docBrokersLock(DocBrokersMutex, std::defer_lock); + if (docBrokersLock.try_lock()) + { + cleanupDocBrokers(); + docBrokersLock.unlock(); + } + std::unique_lock<std::mutex> lock(NewChildrenMutex, std::defer_lock); if (!lock.try_lock()) { @@ -468,6 +500,8 @@ private: // In that case, we can use a pool and index by publicPath. std::unique_lock<std::mutex> lock(DocBrokersMutex); + cleanupDocBrokers(); + //FIXME: What if the same document is already open? Need a fake dockey here? Log::debug("New DocumentBroker for docKey [" + docKey + "]."); DocBrokers.emplace(docKey, docBroker); @@ -683,6 +717,8 @@ private: return; } + cleanupDocBrokers(); + // Lookup this document. auto it = DocBrokers.find(docKey); if (it != DocBrokers.end()) @@ -1991,6 +2027,7 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/) try { std::unique_lock<std::mutex> DocBrokersLock(DocBrokersMutex); + cleanupDocBrokers(); for (auto& brokerIt : DocBrokers) { brokerIt.second->autoSave(false, 0); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits