loolwsd/Admin.cpp | 10 +++++----- loolwsd/Admin.hpp | 5 ++--- loolwsd/AdminModel.cpp | 16 ++++++++-------- loolwsd/AdminModel.hpp | 38 ++++++++++++++++++++------------------ loolwsd/DocumentBroker.hpp | 2 ++ loolwsd/LOOLWSD.cpp | 26 +++++++++++++------------- loolwsd/LOOLWSD.hpp | 3 +++ 7 files changed, 53 insertions(+), 47 deletions(-)
New commits: commit 91c6154fc0900331dbe075207896ae9914ad4fb0 Author: Pranav Kant <[email protected]> Date: Fri Apr 15 14:30:22 2016 +0530 loolwsd: Use docKey as key for Admin instead of PID Also change some variable names to be consistent with rest of the coding style. Change-Id: Icca9a9aec9bfb34c1edd5b6533d7646b05fe814f diff --git a/loolwsd/Admin.cpp b/loolwsd/Admin.cpp index 1202e95..3feec33 100644 --- a/loolwsd/Admin.cpp +++ b/loolwsd/Admin.cpp @@ -188,7 +188,7 @@ void AdminRequestHandler::handleWSRequests(HTTPServerRequest& request, HTTPServe { if (std::stoi(tokens[1])) { - IoUtil::writeFIFO(LOOLWSD::ForKitWritePipe, firstLine + "\n"); + LOOLWSD::killKit(std::stoi(tokens[1])); } } catch(std::exception& e) @@ -384,16 +384,16 @@ Admin::~Admin() _cpuStatsTask->cancel(); } -void Admin::addDoc(Poco::Process::PID pid, const std::string& filename, const int sessionId) +void Admin::addDoc(const std::string& docKey, Poco::Process::PID pid, const std::string& filename, const int sessionId) { std::unique_lock<std::mutex> modelLock(_modelMutex); - _model.addDocument(pid, filename, sessionId); + _model.addDocument(docKey, pid, filename, sessionId); } -void Admin::rmDoc(Poco::Process::PID pid, const int sessionId) +void Admin::rmDoc(const std::string& docKey, const int sessionId) { std::unique_lock<std::mutex> modelLock(_modelMutex); - _model.removeDocument(pid, sessionId); + _model.removeDocument(docKey, sessionId); } void MemoryStats::run() diff --git a/loolwsd/Admin.hpp b/loolwsd/Admin.hpp index 9f4d838..a281ba5 100644 --- a/loolwsd/Admin.hpp +++ b/loolwsd/Admin.hpp @@ -54,12 +54,11 @@ public: void update(const std::string& message); /// Calls with same pid will increment view count, if pid already exists - void addDoc(Poco::Process::PID pid, const std::string& filename, const int sessionId); + void addDoc(const std::string& docKey, Poco::Process::PID pid, const std::string& filename, const int sessionId); /// Decrement view count till becomes zero after which doc is removed - void rmDoc(Poco::Process::PID pid, const int nSessionId); + void rmDoc(const std::string& docKey, const int nSessionId); - /// Set the forkit process id. void setForKitPid(const int forKitPid) { _forKitPid = forKitPid; } /// Callers must ensure that modelMutex is acquired diff --git a/loolwsd/AdminModel.cpp b/loolwsd/AdminModel.cpp index 3ff9477..fec35d9 100644 --- a/loolwsd/AdminModel.cpp +++ b/loolwsd/AdminModel.cpp @@ -33,7 +33,7 @@ void Document::addView(int sessionId) } else { - _nActiveViews++; + _activeViews++; } } @@ -45,11 +45,11 @@ int Document::expireView(int sessionId) it->second.expire(); // If last view, expire the Document also - if (--_nActiveViews == 0) + if (--_activeViews == 0) _end = std::time(nullptr); } - return _nActiveViews; + return _activeViews; } /////////////////// @@ -243,9 +243,9 @@ void AdminModel::notify(const std::string& message) } } -void AdminModel::addDocument(Poco::Process::PID pid, const std::string& filename, const int sessionId) +void AdminModel::addDocument(const std::string& docKey, Poco::Process::PID pid, const std::string& filename, const int sessionId) { - const auto ret = _documents.emplace(pid, Document(pid, filename)); + const auto ret = _documents.emplace(docKey, Document(docKey, pid, filename)); ret.first->second.addView(sessionId); // Notify the subscribers @@ -260,15 +260,15 @@ void AdminModel::addDocument(Poco::Process::PID pid, const std::string& filename notify(oss.str()); } -void AdminModel::removeDocument(Poco::Process::PID pid, const int sessionId) +void AdminModel::removeDocument(const std::string& docKey, const int sessionId) { - auto docIt = _documents.find(pid); + auto docIt = _documents.find(docKey); if (docIt != _documents.end() && !docIt->second.isExpired()) { // Notify the subscribers std::ostringstream oss; oss << "rmdoc" << " " - << pid << " " + << docIt->second.getPid() << " " << sessionId; Log::info("Message to admin console: " + oss.str()); notify(oss.str()); diff --git a/loolwsd/AdminModel.hpp b/loolwsd/AdminModel.hpp index 843320d..806fb5c 100644 --- a/loolwsd/AdminModel.hpp +++ b/loolwsd/AdminModel.hpp @@ -23,7 +23,7 @@ class View { public: View(int sessionId) - : _nSessionId(sessionId), + : _sessionId(sessionId), _start(std::time(nullptr)) { } @@ -32,7 +32,7 @@ public: bool isExpired() { return _end != 0 && std::time(nullptr) >= _end; } private: - int _nSessionId; + int _sessionId; std::time_t _start; std::time_t _end = 0; @@ -41,22 +41,23 @@ private: class Document { public: - Document(Poco::Process::PID pid, std::string filename) - : _nPid(pid), - _sFilename(filename), + Document(std::string docKey, Poco::Process::PID pid, std::string filename) + : _docKey(docKey), + _pid(pid), + _filename(filename), _start(std::time(nullptr)) { - Log::info("Document " + std::to_string(_nPid) + " ctor."); + Log::info("Document " + _docKey + " ctor."); } ~Document() { - Log::info("Document " + std::to_string(_nPid) + " dtor."); + Log::info("Document " + _docKey + " dtor."); } - Poco::Process::PID getPid() const { return _nPid; } + Poco::Process::PID getPid() const { return _pid; } - std::string getFilename() const { return _sFilename; } + std::string getFilename() const { return _filename; } bool isExpired() const { return _end != 0 && std::time(nullptr) >= _end; } @@ -66,16 +67,17 @@ public: int expireView(int sessionId); - unsigned getActiveViews() const { return _nActiveViews; } + unsigned getActiveViews() const { return _activeViews; } private: - Poco::Process::PID _nPid; + const std::string _docKey; + const Poco::Process::PID _pid; /// SessionId mapping to View object std::map<int, View> _views; /// Total number of active views - unsigned _nActiveViews = 0; + unsigned _activeViews = 0; /// Hosted filename - std::string _sFilename; + std::string _filename; std::time_t _start; std::time_t _end = 0; @@ -85,7 +87,7 @@ class Subscriber { public: Subscriber(int sessionId, std::shared_ptr<Poco::Net::WebSocket>& ws) - : _nSessionId(sessionId), + : _sessionId(sessionId), _ws(ws), _start(std::time(nullptr)) { @@ -109,7 +111,7 @@ public: private: /// Admin session Id - int _nSessionId; + int _sessionId; /// WebSocket to use to send messages to session std::weak_ptr<Poco::Net::WebSocket> _ws; @@ -156,9 +158,9 @@ public: void notify(const std::string& message); - void addDocument(Poco::Process::PID pid, const std::string& filename, const int sessionId); + void addDocument(const std::string& docKey, Poco::Process::PID pid, const std::string& filename, const int sessionId); - void removeDocument(Poco::Process::PID pid, const int sessionId); + void removeDocument(const std::string& docKey, const int sessionId); private: @@ -172,7 +174,7 @@ private: private: std::map<int, Subscriber> _subscribers; - std::map<Poco::Process::PID, Document> _documents; + std::map<std::string, Document> _documents; std::list<unsigned> _memStats; unsigned _memStatsSize = 100; diff --git a/loolwsd/DocumentBroker.hpp b/loolwsd/DocumentBroker.hpp index 998ea91..599fb3f 100644 --- a/loolwsd/DocumentBroker.hpp +++ b/loolwsd/DocumentBroker.hpp @@ -172,6 +172,8 @@ public: unsigned getWSSessionsCount() { return _wsSessions.size(); } + void kill() { _childProcess->close(true); }; + private: const Poco::URI _uriPublic; const std::string _docKey; diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index 0cf254d..5d2ca8c 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -805,10 +805,10 @@ public: std::string sessionId; std::string jailId; + std::string docKey; try { const auto params = Poco::URI(request.getURI()).getQueryParameters(); - std::string docKey; for (const auto& param : params) { if (param.first == "sessionId") @@ -875,16 +875,17 @@ public: const auto uri = request.getURI(); // Jail id should be the PID, beacuse Admin need it to calculate the memory + Poco::Process::PID pid; try { - Log::info("Adding doc " + jailId + " to Admin"); - Admin::instance().addDoc(std::stoi(jailId), docBroker->getFilename(), std::stoi(sessionId)); + pid = std::stoi(jailId); } catch (std::invalid_argument& exc) { assert(false); } - + Log::info("Adding doc " + docKey + " to Admin"); + Admin::instance().addDoc(docKey, pid, docBroker->getFilename(), Util::decodeId(sessionId)); if (waitBridgeCompleted(session)) { @@ -919,15 +920,8 @@ public: if (!jailId.empty()) { - try - { - Log::info("Removing doc " + jailId + " from Admin"); - Admin::instance().rmDoc(std::stoi(jailId), std::stoi(sessionId)); - } - catch (std::invalid_argument& exc) - { - assert(false); - } + Log::info("Removing doc " + docKey + " from Admin"); + Admin::instance().rmDoc(docKey, Util::decodeId(sessionId)); } Log::debug("Thread finished."); @@ -1307,6 +1301,12 @@ Process::PID LOOLWSD::createForKit() return child.id(); } +void LOOLWSD::killKit(const Process::PID /*pid*/) +{ + std::unique_lock<std::mutex> docBrokersLock(docBrokersMutex); + // TODO +} + int LOOLWSD::main(const std::vector<std::string>& /*args*/) { Log::initialize("wsd"); diff --git a/loolwsd/LOOLWSD.hpp b/loolwsd/LOOLWSD.hpp index ae290e4..33c8c97 100644 --- a/loolwsd/LOOLWSD.hpp +++ b/loolwsd/LOOLWSD.hpp @@ -55,6 +55,9 @@ public: return Util::encodeId(++NextSessionId, 4); } + static + void killKit(const Poco::Process::PID pid); + protected: void initialize(Poco::Util::Application& self) override; void uninitialize() override; _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
