From 160fe1d668d9c1fa8f089cec34df29c2ba31a56f Mon Sep 17 00:00:00 2001
From: Konstantinos Sideris <sideris.konstantin@gmail.com>
Date: Sat, 21 Oct 2017 21:17:01 +0300
Subject: [PATCH] Remove cache updates from the main thread

---
 CMakeLists.txt      |  5 +++--
 src/Cache.cc        | 17 ++++++++++++-----
 src/ChatPage.cc     | 25 +++++++++----------------
 src/MatrixClient.cc |  6 +++---
 4 files changed, 27 insertions(+), 26 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index b513e297e..6f8c167cb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -41,6 +41,7 @@ endif()
 find_package(Qt5Widgets REQUIRED)
 find_package(Qt5Network REQUIRED)
 find_package(Qt5LinguistTools REQUIRED)
+find_package(Qt5Concurrent REQUIRED)
 
 if (APPLE)
     find_package(Qt5MacExtras REQUIRED)
@@ -318,9 +319,9 @@ if (BUILD_TESTS)
 endif()
 
 if(APPVEYOR_BUILD)
-    set (NHEKO_LIBS matrix_events Qt5::Widgets Qt5::Network lmdb)
+    set (NHEKO_LIBS matrix_events Qt5::Widgets Qt5::Network Qt5::Concurrent lmdb)
 else()
-    set (NHEKO_LIBS matrix_events Qt5::Widgets Qt5::Network ${LMDB_LIBRARY})
+    set (NHEKO_LIBS matrix_events Qt5::Widgets Qt5::Network Qt5::Concurrent ${LMDB_LIBRARY})
 endif()
 
 set (NHEKO_DEPS ${OS_BUNDLE} ${SRC_FILES} ${UI_HEADERS} ${MOC_HEADERS} ${QRC} ${LANG_QRC} ${QM_SRC})
diff --git a/src/Cache.cc b/src/Cache.cc
index 3f7b141b6..010b4aa90 100644
--- a/src/Cache.cc
+++ b/src/Cache.cc
@@ -102,14 +102,21 @@ Cache::setState(const QString &nextBatchToken, const QMap<QString, RoomState> &s
         if (!isMounted_)
                 return;
 
-        auto txn = lmdb::txn::begin(env_);
+        try {
+                auto txn = lmdb::txn::begin(env_);
 
-        setNextBatchToken(txn, nextBatchToken);
+                setNextBatchToken(txn, nextBatchToken);
 
-        for (auto it = states.constBegin(); it != states.constEnd(); it++)
-                insertRoomState(txn, it.key(), it.value());
+                for (auto it = states.constBegin(); it != states.constEnd(); it++)
+                        insertRoomState(txn, it.key(), it.value());
 
-        txn.commit();
+                txn.commit();
+        } catch (const lmdb::error &e) {
+                qCritical() << "The cache couldn't be updated: " << e.what();
+
+                unmount();
+                deleteData();
+        }
 }
 
 void
diff --git a/src/ChatPage.cc b/src/ChatPage.cc
index 5df8dec2e..65fef9de8 100644
--- a/src/ChatPage.cc
+++ b/src/ChatPage.cc
@@ -18,6 +18,7 @@
 #include <QApplication>
 #include <QDebug>
 #include <QSettings>
+#include <QtConcurrent>
 
 #include "AvatarProvider.h"
 #include "ChatPage.h"
@@ -196,6 +197,11 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
                 this,
                 SLOT(initialSyncCompleted(const SyncResponse &)));
         connect(client_.data(), &MatrixClient::initialSyncFailed, this, [=](const QString &msg) {
+                if (client_->getHomeServer().isEmpty()) {
+                        deleteConfigs();
+                        return;
+                }
+
                 initialSyncFailures += 1;
 
                 if (initialSyncFailures >= MAX_INITIAL_SYNC_FAILURES) {
@@ -426,14 +432,7 @@ ChatPage::syncCompleted(const SyncResponse &response)
                 }
         }
 
-        try {
-                cache_->setState(response.nextBatch(), state_manager_);
-        } catch (const lmdb::error &e) {
-                qCritical() << "The cache couldn't be updated: " << e.what();
-                // TODO: Notify the user.
-                cache_->unmount();
-                cache_->deleteData();
-        }
+        QtConcurrent::run(cache_.data(), &Cache::setState, response.nextBatch(), state_manager_);
 
         client_->setNextBatchToken(response.nextBatch());
 
@@ -479,16 +478,10 @@ ChatPage::initialSyncCompleted(const SyncResponse &response)
                 QApplication::processEvents();
         }
 
-        try {
-                cache_->setState(response.nextBatch(), state_manager_);
-        } catch (const lmdb::error &e) {
-                qCritical() << "The cache couldn't be initialized: " << e.what();
-                cache_->unmount();
-                cache_->deleteData();
-        }
-
         client_->setNextBatchToken(response.nextBatch());
 
+        QtConcurrent::run(cache_.data(), &Cache::setState, response.nextBatch(), state_manager_);
+
         // Populate timelines with messages.
         view_manager_->initialize(response.rooms());
 
diff --git a/src/MatrixClient.cc b/src/MatrixClient.cc
index 4ececd013..f0b3bd26a 100644
--- a/src/MatrixClient.cc
+++ b/src/MatrixClient.cc
@@ -56,9 +56,9 @@ MatrixClient::MatrixClient(QString server, QObject *parent)
 void
 MatrixClient::reset() noexcept
 {
-        next_batch_ = "";
-        server_     = "";
-        token_      = "";
+        next_batch_.clear();
+        server_.clear();
+        token_.clear();
 
         txn_id_ = 0;
 }
-- 
GitLab