loolwsd/ChildProcessSession.cpp | 7 +++++ loolwsd/LOOLKit.cpp | 55 +++++++++++++++++++++++++--------------- 2 files changed, 42 insertions(+), 20 deletions(-)
New commits: commit 2c5b02dec0c986c436204d044e477532ba0509dc Author: Ashod Nakashian <[email protected]> Date: Sat Dec 26 11:12:52 2015 -0500 loolwsd: correct lokit document lifecycle Change-Id: Id7fa6259022694efd519d08c05879d734b1b6717 Reviewed-on: https://gerrit.libreoffice.org/20972 Reviewed-by: Ashod Nakashian <[email protected]> Tested-by: Ashod Nakashian <[email protected]> diff --git a/loolwsd/ChildProcessSession.cpp b/loolwsd/ChildProcessSession.cpp index 786fbb6..c31847f 100644 --- a/loolwsd/ChildProcessSession.cpp +++ b/loolwsd/ChildProcessSession.cpp @@ -60,8 +60,15 @@ ChildProcessSession::~ChildProcessSession() { Log::info() << "ChildProcessSession dtor " << Kind::ToMaster << " this:" << this << " ws:" << _ws.get() << Log::end; + + if (_loKitDocument != nullptr) + { + _loKitDocument->pClass->destroyView(_loKitDocument, _viewId); + } + if (LIBREOFFICEKIT_HAS(_loKit, registerCallback)) _loKit->pClass->registerCallback(_loKit, 0, 0); + Util::shutdownWebSocket(*_ws); } diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index 6c9b311..28cb506 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -458,20 +458,23 @@ void run_lok_main(const std::string &loSubPath, Poco::UInt64 _childId, const std Log::error("Cannot set thread name."); #endif - try - { + static const std::string instdir_path = #ifdef __APPLE__ - LibreOfficeKit *loKit(lok_init_2(("/" + loSubPath + "/Frameworks").c_str(), "file:///user")); + ("/" + loSubPath + "/Frameworks"); #else - LibreOfficeKit *loKit(lok_init_2(("/" + loSubPath + "/program").c_str(), "file:///user")); + ("/" + loSubPath + "/program"); #endif - if (!loKit) - { - Log::error("Error: LibreOfficeKit initialization failed. Exiting."); - exit(-1); - } + std::unique_ptr<LibreOfficeKit> loKit(lok_init_2(instdir_path.c_str(), "file:///user")); + if (!loKit) + { + Log::error("Error: LibreOfficeKit initialization failed. Exiting."); + exit(-1); + } + + try + { int writerBroker; int readerBroker; @@ -495,7 +498,7 @@ void run_lok_main(const std::string &loSubPath, Poco::UInt64 _childId, const std std::string aResponse; std::string aMessage; - while ( true ) + while (true) { if ( pStart == pEnd ) { @@ -579,13 +582,13 @@ void run_lok_main(const std::string &loSubPath, Poco::UInt64 _childId, const std if ( _connections.empty() ) { Log::info("Creating main thread for child: " + std::to_string(_childId) + ", thread: " + threadId); - thread = std::make_shared<Connection>(loKit, nullptr, _childId, threadId); + thread = std::make_shared<Connection>(loKit.get(), nullptr, _childId, threadId); } else { Log::info("Creating view thread for child: " + std::to_string(_childId) + ", thread: " + threadId); auto aConnection = _connections.begin(); - thread = std::make_shared<Connection>(loKit, aConnection->second->getLOKitDocument(), _childId, threadId); + thread = std::make_shared<Connection>(loKit.get(), aConnection->second->getLOKitDocument(), _childId, threadId); } auto aInserted = _connections.emplace(threadId, thread); @@ -593,7 +596,7 @@ void run_lok_main(const std::string &loSubPath, Poco::UInt64 _childId, const std if ( aInserted.second ) thread->start(); else - Log::error("Connection not created for child: " + std::to_string(_childId) + ", thread: " + threadId); + Log::error("Connection already exists for child: " + std::to_string(_childId) + ", thread: " + threadId); Log::debug("Connections: " + std::to_string(_connections.size())); } @@ -612,13 +615,6 @@ void run_lok_main(const std::string &loSubPath, Poco::UInt64 _childId, const std } } - // Destroy LibreOfficeKit - // TODO: destroyView for views. - loKit->pClass->destroy(loKit); - - Log::info("Kit process " + std::to_string(Process::id()) + " finished OK. "); - - pthread_exit(0); } catch (const Exception& exc) { @@ -630,6 +626,25 @@ void run_lok_main(const std::string &loSubPath, Poco::UInt64 _childId, const std { Log::error(std::string("Exception: ") + exc.what()); } + + // Get the document to destroy later. + auto loKitDocument = _connections.size() > 0 + ? _connections.begin()->second->getLOKitDocument() + : nullptr; + + // Destroy all connections and views. + _connections.clear(); + + // Destroy the document. + if (loKitDocument != nullptr) + { + loKitDocument->pClass->destroy(loKitDocument); + } + + // Destroy LibreOfficeKit + loKit->pClass->destroy(loKit.get()); + + Log::info("Kit process " + std::to_string(Process::id()) + " finished."); } #ifndef LOOLKIT_NO_MAIN _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
