loolwsd/ChildProcessSession.cpp | 16 ++++++++++--- loolwsd/ChildProcessSession.hpp | 6 ++++ loolwsd/LOOLKit.cpp | 49 +++++++++++++++++++++++++++++++--------- 3 files changed, 57 insertions(+), 14 deletions(-)
New commits: commit c818ece721a60c13692425c303c01dff024ba0e9 Author: Ashod Nakashian <[email protected]> Date: Sun Jan 3 12:38:26 2016 -0500 loolwsd: document loading/unloading notifications Change-Id: I435a4e7f89834bea854a492e487af2a686a6f650 Reviewed-on: https://gerrit.libreoffice.org/21093 Reviewed-by: Ashod Nakashian <[email protected]> Tested-by: Ashod Nakashian <[email protected]> diff --git a/loolwsd/ChildProcessSession.cpp b/loolwsd/ChildProcessSession.cpp index 7180776..8fa38fe 100644 --- a/loolwsd/ChildProcessSession.cpp +++ b/loolwsd/ChildProcessSession.cpp @@ -45,13 +45,17 @@ ChildProcessSession::ChildProcessSession(const std::string& id, std::shared_ptr<Poco::Net::WebSocket> ws, LibreOfficeKit *loKit, LibreOfficeKitDocument * loKitDocument, - const std::string& childId) : + const std::string& childId, + std::function<void(LibreOfficeKitDocument*, int)> onLoad, + std::function<void(int)> onUnload) : LOOLSession(id, Kind::ToMaster, ws), _loKitDocument(loKitDocument), _loKit(loKit), _childId(childId), _viewId(0), - _clientPart(0) + _clientPart(0), + _onLoad(onLoad), + _onUnload(onUnload) { Log::info("ChildProcessSession ctor [" + getName() + "]."); } @@ -62,12 +66,16 @@ ChildProcessSession::~ChildProcessSession() if (_loKitDocument != nullptr) { + _loKitDocument->pClass->registerCallback(_loKitDocument, nullptr, this); + _loKitDocument->pClass->destroyView(_loKitDocument, _viewId); Log::debug("Destroy view [" + getName() + "]-> [" + std::to_string(_viewId) + "]"); } if (LIBREOFFICEKIT_HAS(_loKit, registerCallback)) _loKit->pClass->registerCallback(_loKit, nullptr, this); + + _onUnload(_viewId); } bool ChildProcessSession::_handleInput(const char *buffer, int length) @@ -234,7 +242,7 @@ bool ChildProcessSession::loadDocument(const char *buffer, int length, StringTok std::string timestamp; parseDocOptions(tokens, part, timestamp); - + Log::info("docURL: [" + _docURL + "]."); URI aUri; try { @@ -307,6 +315,8 @@ bool ChildProcessSession::loadDocument(const char *buffer, int length, StringTok if (!getStatus(buffer, length)) return false; + _onLoad(_loKitDocument, _viewId); + return true; } diff --git a/loolwsd/ChildProcessSession.hpp b/loolwsd/ChildProcessSession.hpp index 7f5aa05..9bbb869 100644 --- a/loolwsd/ChildProcessSession.hpp +++ b/loolwsd/ChildProcessSession.hpp @@ -29,7 +29,9 @@ public: std::shared_ptr<Poco::Net::WebSocket> ws, LibreOfficeKit *loKit, LibreOfficeKitDocument * loKitDocument, - const std::string& childId); + const std::string& childId, + std::function<void(LibreOfficeKitDocument*, int)> onLoad, + std::function<void(int)> onUnload); virtual ~ChildProcessSession(); virtual bool getStatus(const char *buffer, int length); @@ -80,6 +82,8 @@ private: /// View ID, returned by createView() or 0 by default. int _viewId; int _clientPart; + std::function<void(LibreOfficeKitDocument*, int)> _onLoad; + std::function<void(int)> _onUnload; }; class CallBackNotification: public Poco::Notification diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index b17e188..142f935 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -259,7 +259,7 @@ public: void run() { - static const std::string thread_name = "lokit_callback_handler"; + static const std::string thread_name = "kit_callback"; #ifdef __linux if (prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(thread_name.c_str()), 0, 0, 0) != 0) Log::error("Cannot set thread name to " + thread_name + "."); @@ -329,7 +329,7 @@ public: void run() override { - static const std::string thread_name = "lokit_queue_handler"; + static const std::string thread_name = "kit_queue_" + _session->getId(); #ifdef __linux if (prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(thread_name.c_str()), 0, 0, 0) != 0) Log::error("Cannot set thread name to " + thread_name + "."); @@ -370,12 +370,16 @@ class Connection: public Runnable { public: Connection(LibreOfficeKit *loKit, LibreOfficeKitDocument *loKitDocument, - const std::string& childId, const std::string& sessionId) : + const std::string& childId, const std::string& sessionId, + std::function<void(LibreOfficeKitDocument*, int)> onLoad, + std::function<void(int)> onUnload) : _loKit(loKit), _loKitDocument(loKitDocument), _childId(childId), _sessionId(sessionId), - _stop(false) + _stop(false), + _onLoad(onLoad), + _onUnload(onUnload) { Log::info("Connection ctor in child: " + childId + ", thread: " + _sessionId); } @@ -415,7 +419,7 @@ public: void run() override { - static const std::string thread_name = "lokit_connection"; + static const std::string thread_name = "kit_socket_" + _sessionId; #ifdef __linux if (prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(thread_name.c_str()), 0, 0, 0) != 0) Log::error("Cannot set thread name to " + thread_name + "."); @@ -433,7 +437,7 @@ public: HTTPResponse response; auto ws = std::make_shared<WebSocket>(cs, request, response); - _session.reset(new ChildProcessSession(_sessionId, ws, _loKit, _loKitDocument, _childId)); + _session.reset(new ChildProcessSession(_sessionId, ws, _loKit, _loKitDocument, _childId, _onLoad, _onUnload)); ws->setReceiveTimeout(0); // child Jail TID PID @@ -498,6 +502,8 @@ private: Thread _thread; std::shared_ptr<ChildProcessSession> _session; volatile bool _stop; + std::function<void(LibreOfficeKitDocument*, int)> _onLoad; + std::function<void(int)> _onUnload; }; // A document container. @@ -514,8 +520,10 @@ public: const std::string& url) : _loKit(loKit), _childId(childId), - _url(url) + _url(url), + _loKitDocument(nullptr) { + Log::info("Document ctor for url [" + url + "] on child [" + childId + "]."); } ~Document() @@ -559,7 +567,9 @@ public: Log::warn("Thread [" + sessionId + "] is not running. Restoring."); _connections.erase(sessionId); - auto thread = std::make_shared<Connection>(_loKit, aItem->second->getLOKitDocument(), _childId, sessionId); + auto thread = std::make_shared<Connection>(_loKit, aItem->second->getLOKitDocument(), _childId, sessionId, + [this](LibreOfficeKitDocument *loKitDocument, const int viewId) { onLoad(loKitDocument, viewId); }, + [this](const int viewId) { onUnload(viewId); }); _connections.emplace(sessionId, thread); thread->start(); } @@ -572,13 +582,17 @@ public: if ( _connections.empty() ) { Log::info("Creating main thread for child: " + _childId + ", thread: " + sessionId); - thread = std::make_shared<Connection>(_loKit, nullptr, _childId, sessionId); + thread = std::make_shared<Connection>(_loKit, nullptr, _childId, sessionId, + [this](LibreOfficeKitDocument *loKitDocument, const int viewId) { onLoad(loKitDocument, viewId); }, + [this](const int viewId) { onUnload(viewId); }); } else { Log::info("Creating view thread for child: " + _childId + ", thread: " + sessionId); auto aConnection = _connections.begin(); - thread = std::make_shared<Connection>(_loKit, aConnection->second->getLOKitDocument(), _childId, sessionId); + thread = std::make_shared<Connection>(_loKit, aConnection->second->getLOKitDocument(), _childId, sessionId, + [this](LibreOfficeKitDocument *loKitDocument, const int viewId) { onLoad(loKitDocument, viewId); }, + [this](const int viewId) { onUnload(viewId); }); } auto aInserted = _connections.emplace(sessionId, thread); @@ -594,6 +608,21 @@ public: private: + void onLoad(LibreOfficeKitDocument *loKitDocument, const int viewId) + { + Log::info("Document [" + _url + "] loaded as view #" + std::to_string(viewId) + "."); + if (_loKitDocument != nullptr) + assert(_loKitDocument == loKitDocument); + _loKitDocument = loKitDocument; + } + + void onUnload(const int viewId) + { + Log::info("Document [" + _url + "] view #" + std::to_string(viewId)+ " unloaded."); + } + +private: + LibreOfficeKit *_loKit; const std::string _childId; const std::string _url; _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
