[Libreoffice-commits] online.git: 4 commits - loleaflet/src loolwsd/Admin.cpp loolwsd/Admin.hpp loolwsd/AdminModel.cpp loolwsd/AdminModel.hpp loolwsd/DocumentBroker.cpp loolwsd/DocumentBroker.hpp loolwsd/LOOLWSD.cpp

Pranav Kant pranavk at collabora.com
Fri Apr 15 08:00:02 UTC 2016


 loleaflet/src/admin/AdminSocketOverview.js |  119 +++++++++++++++--------------
 loolwsd/Admin.cpp                          |   42 ++++------
 loolwsd/Admin.hpp                          |   10 +-
 loolwsd/AdminModel.cpp                     |   98 ++++++++++-------------
 loolwsd/AdminModel.hpp                     |   46 ++++-------
 loolwsd/DocumentBroker.cpp                 |    2 
 loolwsd/DocumentBroker.hpp                 |    1 
 loolwsd/LOOLWSD.cpp                        |   47 +++++------
 8 files changed, 175 insertions(+), 190 deletions(-)

New commits:
commit 61914208bce83fcb5f7c306a9959e4cab93344b8
Author: Pranav Kant <pranavk at collabora.com>
Date:   Fri Apr 15 02:20:05 2016 +0530

    loleaflet: Adapt to new changes in admin console
    
    Change-Id: I0761bd6c5b3650795a318a077eb50d0a8bd161da

diff --git a/loleaflet/src/admin/AdminSocketOverview.js b/loleaflet/src/admin/AdminSocketOverview.js
index 5bcb54e..a930415 100644
--- a/loleaflet/src/admin/AdminSocketOverview.js
+++ b/loleaflet/src/admin/AdminSocketOverview.js
@@ -20,7 +20,7 @@ var AdminSocketOverview = AdminSocketBase.extend({
 
 	onSocketOpen: function() {
 		this.socket.send('documents');
-		this.socket.send('subscribe document addview rmview rmdoc');
+		this.socket.send('subscribe adddoc rmdoc');
 
 		this._getBasicStats();
 		var socketOverview = this;
@@ -78,9 +78,9 @@ var AdminSocketOverview = AdminSocketBase.extend({
 
 		var tableContainer = document.getElementById('doclist');
 		var rowContainer;
-		var pidEle, urlEle, viewsEle, memEle, sDocTimeEle, docEle;
+		var pidEle, nameEle, viewsEle, memEle, sDocTimeEle, docEle, aEle;
 		var nViews, nTotalViews;
-		var docProps, sPid, sUrl, sViews, sMem, sDocTime;
+		var docProps, sPid, sName, sViews, sMem, sDocTime;
 		if (textMsg.startsWith('documents')) {
 			var documents = textMsg.substring('documents'.length);
 			documents = documents.trim().split('\n');
@@ -90,11 +90,11 @@ var AdminSocketOverview = AdminSocketBase.extend({
 				}
 				docProps = documents[i].trim().split(' ');
 				sPid = docProps[0];
-				sUrl = docProps[1];
+				sName = docProps[1];
 				sViews = docProps[2];
 				sMem = docProps[3];
 				sDocTime = docProps[4];
-				if (sUrl === '0') {
+				if (sName === '0') {
 					continue;
 				}
 				rowContainer = document.createElement('tr');
@@ -105,9 +105,9 @@ var AdminSocketOverview = AdminSocketBase.extend({
 				pidEle.innerHTML = sPid;
 				rowContainer.appendChild(pidEle);
 
-				urlEle = document.createElement('td');
-				urlEle.innerHTML = sUrl;
-				rowContainer.appendChild(urlEle);
+				nameEle = document.createElement('td');
+				nameEle.innerHTML = sName;
+				rowContainer.appendChild(nameEle);
 
 				viewsEle = document.createElement('td');
 				viewsEle.id = 'docview' + sPid;
@@ -125,64 +125,60 @@ var AdminSocketOverview = AdminSocketBase.extend({
 				rowContainer.appendChild(sDocTimeEle);
 			}
 		}
-		else if (textMsg.startsWith('addview')) {
-			sPid = textMsg.substring('addview'.length).trim().split(' ')[0];
-			nViews = parseInt(document.getElementById('docview' + sPid).innerHTML);
-			document.getElementById('docview' + sPid).innerHTML = nViews + 1;
-			nTotalViews = parseInt(document.getElementById('active_users_count').innerHTML);
-			document.getElementById('active_users_count').innerHTML = nTotalViews + 1;
-		}
-		else if (textMsg.startsWith('rmview')) {
-			sPid = textMsg.substring('addview'.length).trim().split(' ')[0];
-			nViews = parseInt(document.getElementById('docview' + sPid).innerHTML);
-			document.getElementById('docview' + sPid).innerHTML = nViews - 1;
-			nTotalViews = parseInt(document.getElementById('active_users_count').innerHTML);
-			document.getElementById('active_users_count').innerHTML = nTotalViews - 1;
-		}
-		else if (textMsg.startsWith('document')) {
-			textMsg = textMsg.substring('document'.length);
+		else if (textMsg.startsWith('adddoc')) {
+			textMsg = textMsg.substring('adddoc'.length);
 			docProps = textMsg.trim().split(' ');
 			sPid = docProps[0];
-			sUrl = docProps[1];
-			sMem = docProps[2];
+			sName = docProps[1];
+			// docProps[2] == sessionid
+			sMem = docProps[3];
 
 			docEle = document.getElementById('doc' + sPid);
-			if (docEle) {
-				tableContainer.removeChild(docEle);
-			}
-			if (sUrl === '0') {
-				return;
-			}
+			if (!docEle) {
 
-			rowContainer = document.createElement('tr');
-			rowContainer.id = 'doc' + docProps[0];
-			tableContainer.appendChild(rowContainer);
+				if (sName === '0') {
+					return;
+				}
 
-			pidEle = document.createElement('td');
-			pidEle.innerHTML = docProps[0];
-			rowContainer.appendChild(pidEle);
+				rowContainer = document.createElement('tr');
+				rowContainer.id = 'doc' + sPid;
+				tableContainer.appendChild(rowContainer);
 
-			urlEle = document.createElement('td');
-			urlEle.innerHTML = docProps[1];
-			rowContainer.appendChild(urlEle);
+				pidEle = document.createElement('td');
+				pidEle.innerHTML = sPid;
+				rowContainer.appendChild(pidEle);
 
-			viewsEle = document.createElement('td');
-			viewsEle.innerHTML = 0;
-			viewsEle.id = 'docview' + docProps[0];
-			rowContainer.appendChild(viewsEle);
+				nameEle = document.createElement('td');
+				nameEle.innerHTML = sName;
+				rowContainer.appendChild(nameEle);
 
-			memEle = document.createElement('td');
-			memEle.innerHTML = Util.humanizeMem(parseInt(sMem));
-			rowContainer.appendChild(memEle);
+				viewsEle = document.createElement('td');
+				viewsEle.innerHTML = 0;
+				viewsEle.id = 'docview' + sPid;
+				rowContainer.appendChild(viewsEle);
 
-			sDocTimeEle = document.createElement('td');
-			sDocTimeEle.className = 'elapsed_time';
-			sDocTimeEle.value = 0;
-			sDocTimeEle.innerHTML = Util.humanizeSecs(0);
-			rowContainer.appendChild(sDocTimeEle);
+				memEle = document.createElement('td');
+				memEle.innerHTML = Util.humanizeMem(parseInt(sMem));
+				rowContainer.appendChild(memEle);
+
+				sDocTimeEle = document.createElement('td');
+				sDocTimeEle.className = 'elapsed_time';
+				sDocTimeEle.value = 0;
+				sDocTimeEle.innerHTML = Util.humanizeSecs(0);
+				rowContainer.appendChild(sDocTimeEle);
 
-			var totalUsersEle = document.getElementById('active_docs_count');
-			totalUsersEle.innerHTML = parseInt(totalUsersEle.innerHTML) + 1;
+				var totalUsersEle = document.getElementById('active_docs_count');
+				totalUsersEle.innerHTML = parseInt(totalUsersEle.innerHTML) + 1;
+
+			}
+
+			viewsEle = document.getElementById('docview' + sPid);
+			nViews = parseInt(viewsEle.innerHTML);
+			viewsEle.innerHTML = nViews + 1;
+
+			aEle = document.getElementById('active_users_count');
+			nTotalViews = parseInt(aEle.innerHTML);
+			aEle.innerHTML = nTotalViews + 1;
 		}
 		else if (textMsg.startsWith('total_mem') ||
 			textMsg.startsWith('active_docs_count') ||
@@ -201,9 +197,20 @@ var AdminSocketOverview = AdminSocketBase.extend({
 			textMsg = textMsg.substring('rmdoc'.length);
 			docProps = textMsg.trim().split(' ');
 			sPid = docProps[0];
+			// docProps[1] == sessionid
+
 			docEle = document.getElementById('doc' + sPid);
 			if (docEle) {
-				tableContainer.removeChild(docEle);
+				viewsEle = document.getElementById('docview' + sPid);
+				nViews = parseInt(viewsEle.innerHTML) - 1;
+				viewsEle.innerHTML = nViews;
+				if (!nViews) {
+					tableContainer.removeChild(docEle);
+				}
+
+				aEle = document.getElementById('active_users_count');
+				nTotalViews = parseInt(aEle.innerHTML);
+				aEle.innerHTML = nTotalViews - 1;
 			}
 		}
 	},
commit 7bf5e84a90ac5b106b49bb07add3f4e509dc15f6
Author: Pranav Kant <pranavk at collabora.com>
Date:   Fri Apr 15 01:59:31 2016 +0530

    loolwsd: Make admin console work (again)
    
    Change-Id: Ib51f33c60b5e42e154795357a7a787cb8691ad51

diff --git a/loolwsd/Admin.cpp b/loolwsd/Admin.cpp
index f2eee9c..1202e95 100644
--- a/loolwsd/Admin.cpp
+++ b/loolwsd/Admin.cpp
@@ -384,10 +384,16 @@ Admin::~Admin()
     _cpuStatsTask->cancel();
 }
 
-void Admin::update(const std::string& message)
+void Admin::addDoc(Poco::Process::PID pid, const std::string& filename, const int sessionId)
 {
     std::unique_lock<std::mutex> modelLock(_modelMutex);
-    _model.update(message);
+    _model.addDocument(pid, filename, sessionId);
+}
+
+void Admin::rmDoc(Poco::Process::PID pid, const int sessionId)
+{
+    std::unique_lock<std::mutex> modelLock(_modelMutex);
+    _model.removeDocument(pid, sessionId);
 }
 
 void MemoryStats::run()
@@ -396,7 +402,7 @@ void MemoryStats::run()
     AdminModel& model = _admin->getModel();
     unsigned totalMem = _admin->getTotalMemoryUsage(model);
 
-    Log::trace() << "Total memory used: " << std::to_string(totalMem);
+    Log::info("Total memory used: " + std::to_string(totalMem));
     model.addMemStats(totalMem);
 }
 
diff --git a/loolwsd/Admin.hpp b/loolwsd/Admin.hpp
index b3fedf5..9f4d838 100644
--- a/loolwsd/Admin.hpp
+++ b/loolwsd/Admin.hpp
@@ -53,6 +53,12 @@ public:
     /// Update the Admin Model.
     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);
+
+    /// Decrement view count till becomes zero after which doc is removed
+    void rmDoc(Poco::Process::PID pid, const int nSessionId);
+
     /// Set the forkit process id.
     void setForKitPid(const int forKitPid) { _forKitPid = forKitPid; }
 
diff --git a/loolwsd/AdminModel.cpp b/loolwsd/AdminModel.cpp
index 709f74b..3ff9477 100644
--- a/loolwsd/AdminModel.cpp
+++ b/loolwsd/AdminModel.cpp
@@ -24,12 +24,12 @@ using Poco::StringTokenizer;
 /////////////////
 // Document Impl
 ////////////////
-void Document::addView(int nSessionId)
+void Document::addView(int sessionId)
 {
-    const auto ret = _views.emplace(nSessionId, View(nSessionId));
+    const auto ret = _views.emplace(sessionId, View(sessionId));
     if (!ret.second)
     {
-        Log::warn() << "View with SessionID [" + std::to_string(nSessionId) + "] already exists." << Log::end;
+        Log::warn() << "View with SessionID [" + std::to_string(sessionId) + "] already exists." << Log::end;
     }
     else
     {
@@ -37,14 +37,19 @@ void Document::addView(int nSessionId)
     }
 }
 
-void Document::removeView(int nSessionId)
+int Document::expireView(int sessionId)
 {
-    auto it = _views.find(nSessionId);
+    auto it = _views.find(sessionId);
     if (it != _views.end())
     {
         it->second.expire();
-        _nActiveViews--;
+
+        // If last view, expire the Document also
+        if (--_nActiveViews == 0)
+            _end = std::time(nullptr);
     }
+
+    return _nActiveViews;
 }
 
 ///////////////////
@@ -84,46 +89,6 @@ void  Subscriber::unsubscribe(const std::string& command)
 // AdminModel Impl
 //////////////////
 
-void AdminModel::update(const std::string& data)
-{
-    StringTokenizer tokens(data, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
-
-    Log::info("AdminModel Recv: " + data);
-
-    if (tokens[0] == "document")
-    {
-        addDocument(std::stoi(tokens[1]), tokens[2]);
-        unsigned mem = Util::getMemoryUsage(std::stoi(tokens[1]));
-        std::string response = data + std::to_string(mem);
-        notify(response);
-        return;
-    }
-    else if (tokens[0] == "addview")
-    {
-        auto it = _documents.find(std::stoi(tokens[1]));
-        if (it != _documents.end())
-        {
-            const unsigned nSessionId = Util::decodeId(tokens[2]);
-            it->second.addView(nSessionId);
-        }
-    }
-    else if (tokens[0] == "rmview")
-    {
-        auto it = _documents.find(std::stoi(tokens[1]));
-        if (it != _documents.end())
-        {
-            const unsigned nSessionId = Util::decodeId(tokens[2]);
-            it->second.removeView(nSessionId);
-        }
-    }
-    else if (tokens[0] == "rmdoc")
-    {
-        removeDocument(std::stoi(tokens[1]));
-    }
-
-    notify(data);
-}
-
 std::string AdminModel::query(const std::string& command)
 {
     StringTokenizer tokens(command, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
@@ -278,21 +243,43 @@ void AdminModel::notify(const std::string& message)
     }
 }
 
-void AdminModel::addDocument(Poco::Process::PID pid, const std::string& url)
+void AdminModel::addDocument(Poco::Process::PID pid, const std::string& filename, const int sessionId)
 {
-    _documents.emplace(pid, Document(pid, url));
+    const auto ret = _documents.emplace(pid, Document(pid, filename));
+    ret.first->second.addView(sessionId);
+
+    // Notify the subscribers
+    unsigned memUsage = Util::getMemoryUsage(pid);
+    std::ostringstream oss;
+    oss << "adddoc" << " "
+        << pid << " "
+        << filename << " "
+        << sessionId << " "
+        << std::to_string(memUsage);
+    Log::info("Message to admin console: " + oss.str());
+    notify(oss.str());
 }
 
-void AdminModel::removeDocument(Poco::Process::PID pid)
+void AdminModel::removeDocument(Poco::Process::PID pid, const int sessionId)
 {
-    auto it = _documents.find(pid);
-    if (it != _documents.end() && !it->second.isExpired())
+    auto docIt = _documents.find(pid);
+    if (docIt != _documents.end() && !docIt->second.isExpired())
     {
+        // Notify the subscribers
+        std::ostringstream oss;
+        oss << "rmdoc" << " "
+            << pid << " "
+            << sessionId;
+        Log::info("Message to admin console: " + oss.str());
+        notify(oss.str());
+
         // TODO: The idea is to only expire the document and keep the history
         // of documents open and close, to be able to give a detailed summary
         // to the admin console with views. For now, just remove the document.
-        it->second.expire();
-        _documents.erase(it);
+        if (docIt->second.expireView(sessionId) == 0)
+        {
+            _documents.erase(docIt);
+        }
     }
 }
 
@@ -341,13 +328,14 @@ std::string AdminModel::getDocuments()
             continue;
 
         std::string sPid = std::to_string(it.second.getPid());
-        std::string sUrl = it.second.getUrl();
+        // TODO: URI encode the filename
+        std::string sFilename = it.second.getFilename();
         std::string sViews = std::to_string(it.second.getActiveViews());
         std::string sMem = std::to_string(Util::getMemoryUsage(it.second.getPid()));
         std::string sElapsed = std::to_string(it.second.getElapsedTime());
 
         oss << sPid << " "
-            << sUrl << " "
+            << sFilename << " "
             << sViews << " "
             << sMem << " "
             << sElapsed << " \n ";
diff --git a/loolwsd/AdminModel.hpp b/loolwsd/AdminModel.hpp
index 639dd43..843320d 100644
--- a/loolwsd/AdminModel.hpp
+++ b/loolwsd/AdminModel.hpp
@@ -22,8 +22,8 @@
 class View
 {
 public:
-    View(int nSessionId)
-        : _nSessionId(nSessionId),
+    View(int sessionId)
+        : _nSessionId(sessionId),
           _start(std::time(nullptr))
     {    }
 
@@ -41,9 +41,9 @@ private:
 class Document
 {
 public:
-    Document(Poco::Process::PID nPid, std::string sUrl)
-        : _nPid(nPid),
-          _sUrl(sUrl),
+    Document(Poco::Process::PID pid, std::string filename)
+        : _nPid(pid),
+          _sFilename(filename),
           _start(std::time(nullptr))
     {
         Log::info("Document " + std::to_string(_nPid) + " ctor.");
@@ -56,17 +56,15 @@ public:
 
     Poco::Process::PID getPid() const { return _nPid; }
 
-    std::string getUrl() const { return _sUrl; }
-
-    void expire() { _end = std::time(nullptr); }
+    std::string getFilename() const { return _sFilename; }
 
     bool isExpired() const { return _end != 0 && std::time(nullptr) >= _end; }
 
     std::time_t getElapsedTime() const { return std::time(nullptr) - _start; }
 
-    void addView(int nSessionId);
+    void addView(int sessionId);
 
-    void removeView(int nSessionId);
+    int expireView(int sessionId);
 
     unsigned getActiveViews() const { return _nActiveViews; }
 
@@ -76,8 +74,8 @@ private:
     std::map<int, View> _views;
     /// Total number of active views
     unsigned _nActiveViews = 0;
-    /// Hosted URL
-    std::string _sUrl;
+    /// Hosted filename
+    std::string _sFilename;
 
     std::time_t _start;
     std::time_t _end = 0;
@@ -86,8 +84,8 @@ private:
 class Subscriber
 {
 public:
-    Subscriber(int nSessionId, std::shared_ptr<Poco::Net::WebSocket>& ws)
-        : _nSessionId(nSessionId),
+    Subscriber(int sessionId, std::shared_ptr<Poco::Net::WebSocket>& ws)
+        : _nSessionId(sessionId),
           _ws(ws),
           _start(std::time(nullptr))
     {
@@ -119,11 +117,6 @@ private:
 
     std::time_t _start;
     std::time_t _end = 0;
-
-    /// In case of huge number of documents,
-    /// client can tell us the specific page it is
-    /// interested in getting live notifications
-    unsigned _currentPage;
 };
 
 class AdminModel
@@ -139,17 +132,15 @@ public:
         Log::info("AdminModel dtor.");
     }
 
-    void update(const std::string& data);
-
     std::string query(const std::string& command);
 
     /// Returns memory consumed by all active loolkit processes
     unsigned getTotalMemoryUsage();
 
-    void subscribe(int nSessionId, std::shared_ptr<Poco::Net::WebSocket>& ws);
-    void subscribe(int nSessionId, const std::string& command);
+    void subscribe(int sessionId, std::shared_ptr<Poco::Net::WebSocket>& ws);
+    void subscribe(int sessionId, const std::string& command);
 
-    void unsubscribe(int nSessionId, const std::string& command);
+    void unsubscribe(int sessionId, const std::string& command);
 
     void clearMemStats() { _memStats.clear(); }
 
@@ -165,10 +156,11 @@ public:
 
     void notify(const std::string& message);
 
-private:
-    void addDocument(Poco::Process::PID pid, const std::string& url);
+    void addDocument(Poco::Process::PID pid, const std::string& filename, const int sessionId);
+
+    void removeDocument(Poco::Process::PID pid, const int sessionId);
 
-    void removeDocument(Poco::Process::PID pid);
+private:
 
     std::string getMemStats();
 
diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index 0ec21ea..0274cf0 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -116,7 +116,7 @@ bool DocumentBroker::load(const std::string& jailId)
     {
         const auto fileInfo = storage->getFileInfo(_uriPublic);
         _tileCache.reset(new TileCache(_uriPublic.toString(), fileInfo.ModifiedTime, _cacheRoot));
-
+        _filename = fileInfo.Filename;
         _storage = StorageBase::create(jailRoot, jailPath.toString(), _uriPublic);
 
         const auto localPath = _storage->loadStorageFileToLocal();
diff --git a/loolwsd/DocumentBroker.hpp b/loolwsd/DocumentBroker.hpp
index 6e260d9..998ea91 100644
--- a/loolwsd/DocumentBroker.hpp
+++ b/loolwsd/DocumentBroker.hpp
@@ -145,6 +145,7 @@ public:
     Poco::URI getJailedUri() const { return _uriJailed; }
     const std::string& getJailId() const { return _jailId; }
     const std::string& getDocKey() const { return _docKey; }
+    const std::string& getFilename() const { return _filename; };
     TileCache& tileCache() { return *_tileCache; }
     unsigned getSessionsCount() const
     {
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index f8eff17..0cf254d 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -390,12 +390,6 @@ private:
                     {
                         Log::debug("Removing DocumentBroker for docKey [" + docKey + "].");
                         docBrokers.erase(docKey);
-
-                        std::ostringstream message;
-                        message << "rmdoc" << " "
-                                << docBroker->getJailId() << " "
-                                << "\n";
-                        Admin::instance().update(message.str());
                     }
                 }
 
@@ -879,18 +873,18 @@ public:
             AvailableChildSessionCV.notify_one();
 
             const auto uri = request.getURI();
-            std::ostringstream message;
-            message << "document" << " "
-                    << jailId << " "
-                    << uri.substr(uri.find_last_of("/") + 1) << " "
-                    << "\n";
-            Admin::instance().update(message.str());
-
-            message << "addview" << " "
-                    << jailId << " "
-                    << sessionId << " "
-                    << "\n";
-            Admin::instance().update(message.str());
+
+            // Jail id should be the PID, beacuse Admin need it to calculate the memory
+            try
+            {
+                Log::info("Adding doc " + jailId + " to Admin");
+                Admin::instance().addDoc(std::stoi(jailId), docBroker->getFilename(), std::stoi(sessionId));
+            }
+            catch (std::invalid_argument& exc)
+            {
+                assert(false);
+            }
+
 
             if (waitBridgeCompleted(session))
             {
@@ -925,12 +919,15 @@ public:
 
         if (!jailId.empty())
         {
-            std::ostringstream message;
-            message << "rmview" << " "
-                    << jailId << " "
-                    << sessionId << " "
-                    << "\n";
-            Admin::instance().update(message.str());
+            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::debug("Thread finished.");
commit 4f9eef93245c9a796729fdd509d0cee653af6eca
Author: Pranav Kant <pranavk at collabora.com>
Date:   Wed Apr 13 13:46:57 2016 +0530

    loolwsd: Be consistent, and use unique_lock
    
    Change-Id: Idfc14bb7dd82827493865241f6d04cf9ae4a88fc

diff --git a/loolwsd/Admin.cpp b/loolwsd/Admin.cpp
index 47b7ef6..f2eee9c 100644
--- a/loolwsd/Admin.cpp
+++ b/loolwsd/Admin.cpp
@@ -386,7 +386,7 @@ Admin::~Admin()
 
 void Admin::update(const std::string& message)
 {
-    std::lock_guard<std::mutex> modelLock(_modelMutex);
+    std::unique_lock<std::mutex> modelLock(_modelMutex);
     _model.update(message);
 }
 
commit 9669470d091fd0e4d60cce469109d6e735671a58
Author: Pranav Kant <pranavk at collabora.com>
Date:   Wed Apr 13 13:44:54 2016 +0530

    loolwsd: Admin doesn't need its own thread now
    
    The timers are cancelled upon destruction of the static Admin
    instance.
    
    Change-Id: Ie43dc9d3ec96b002e12685ec997ad83c29b684d0

diff --git a/loolwsd/Admin.cpp b/loolwsd/Admin.cpp
index 899e902..47b7ef6 100644
--- a/loolwsd/Admin.cpp
+++ b/loolwsd/Admin.cpp
@@ -367,11 +367,21 @@ void AdminRequestHandler::handleRequest(HTTPServerRequest& request, HTTPServerRe
 Admin::Admin() :
     _model(AdminModel())
 {
+    Log::info("Admin ctor.");
+
+    _memStatsTask = new MemoryStats(this);
+    _memStatsTimer.schedule(_memStatsTask, _memStatsTaskInterval, _memStatsTaskInterval);
+
+    _cpuStatsTask = new CpuStats(this);
+    _cpuStatsTimer.schedule(_cpuStatsTask, _cpuStatsTaskInterval, _cpuStatsTaskInterval);
 }
 
 Admin::~Admin()
 {
     Log::info("~Admin dtor.");
+
+    _memStatsTask->cancel();
+    _cpuStatsTask->cancel();
 }
 
 void Admin::update(const std::string& message)
@@ -434,24 +444,6 @@ unsigned Admin::getCpuStatsInterval()
     return _cpuStatsTaskInterval;
 }
 
-void Admin::run()
-{
-    _memStatsTask = new MemoryStats(this);
-    _memStatsTimer.schedule(_memStatsTask, _memStatsTaskInterval, _memStatsTaskInterval);
-
-    _cpuStatsTask = new CpuStats(this);
-    _cpuStatsTimer.schedule(_cpuStatsTask, _cpuStatsTaskInterval, _cpuStatsTaskInterval);
-
-    Util::setThreadName("admin_thread");
-
-    Log::debug("Thread started.");
-
-    _memStatsTimer.cancel();
-    _cpuStatsTimer.cancel();
-
-    Log::debug("Thread finished.");
-}
-
 AdminModel& Admin::getModel()
 {
     return _model;
diff --git a/loolwsd/Admin.hpp b/loolwsd/Admin.hpp
index c5a6258..b3fedf5 100644
--- a/loolwsd/Admin.hpp
+++ b/loolwsd/Admin.hpp
@@ -37,7 +37,7 @@ private:
 };
 
 /// An admin command processor.
-class Admin : public Poco::Runnable
+class Admin
 {
 public:
     virtual ~Admin();
@@ -50,8 +50,6 @@ public:
 
     unsigned getTotalMemoryUsage(AdminModel&);
 
-    void run() override;
-
     /// Update the Admin Model.
     void update(const std::string& message);
 
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index 6c1d790..f8eff17 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -1438,8 +1438,6 @@ int LOOLWSD::main(const std::vector<std::string>& /*args*/)
     }
     Log::debug("open(" + pipeLoolwsd + ", WRONLY) = " + std::to_string(ForKitWritePipe));
 
-    threadPool.start(Admin::instance());
-
     preForkChildren();
 
     time_t last30SecCheck = time(NULL);


More information about the Libreoffice-commits mailing list