Remove cache updates from the main thread

This commit is contained in:
Konstantinos Sideris 2017-10-21 21:17:01 +03:00
parent 3cae6c3983
commit 160fe1d668
4 changed files with 27 additions and 26 deletions

View file

@ -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})

View file

@ -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

View file

@ -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());

View file

@ -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;
}