diff --git a/src/libs/registry/CMakeLists.txt b/src/libs/registry/CMakeLists.txt index b0010d71..f63821ba 100644 --- a/src/libs/registry/CMakeLists.txt +++ b/src/libs/registry/CMakeLists.txt @@ -7,7 +7,6 @@ add_library(Registry STATIC searchquery.cpp # Show headers without .cpp in Qt Creator. - cancellationtoken.h itemdatarole.h searchresult.h ) diff --git a/src/libs/registry/cancellationtoken.h b/src/libs/registry/cancellationtoken.h deleted file mode 100644 index 4e069301..00000000 --- a/src/libs/registry/cancellationtoken.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) Oleg Shparber, et al. -// Copyright (C) 2015 Artur Spychaj -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef ZEAL_REGISTRY_CANCELLATIONTOKEN_H -#define ZEAL_REGISTRY_CANCELLATIONTOKEN_H - -#include - -namespace Zeal::Registry { - -/// Token that stores whether cancel was called on it. -/// In async code can be used to check if another thread called cancel. -class CancellationToken -{ -public: - inline bool isCanceled() const { return m_canceled; } - - inline void cancel() { m_canceled = true; } - - inline void reset() { m_canceled = false; } - -private: - std::atomic_bool m_canceled{false}; -}; - -} // namespace Zeal::Registry - -#endif // ZEAL_REGISTRY_CANCELLATIONTOKEN_H diff --git a/src/libs/registry/docset.cpp b/src/libs/registry/docset.cpp index 634519ee..c2e97493 100644 --- a/src/libs/registry/docset.cpp +++ b/src/libs/registry/docset.cpp @@ -4,7 +4,6 @@ #include "docset.h" -#include "cancellationtoken.h" #include "searchresult.h" #include @@ -310,7 +309,7 @@ const QMultiMap &Docset::symbols(const QString &symbolType) const return m_symbols[symbolType]; } -QList Docset::search(const QString &query, const CancellationToken &token) const +QList Docset::search(const QString &query, const std::atomic_bool &canceled) const { QString sql; if (m_type == Docset::Type::Dash) { @@ -351,7 +350,7 @@ QList Docset::search(const QString &query, const CancellationToken m_db->prepare(sql.arg(sanitizedQuery)); QList results; - while (m_db->next() && !token.isCanceled()) { + while (m_db->next() && !canceled.load(std::memory_order_relaxed)) { SearchResult result; result.name = m_db->value(0).toString(); result.type = parseSymbolType(m_db->value(1).toString()); diff --git a/src/libs/registry/docset.h b/src/libs/registry/docset.h index ee45f969..67fa088b 100644 --- a/src/libs/registry/docset.h +++ b/src/libs/registry/docset.h @@ -11,6 +11,8 @@ #include #include +#include + namespace Zeal { namespace Util { @@ -19,7 +21,6 @@ class SQLiteDatabase; namespace Registry { -class CancellationToken; struct SearchResult; class Docset final @@ -50,7 +51,7 @@ public: const QMultiMap &symbols(const QString &symbolType) const; - QList search(const QString &query, const CancellationToken &token) const; + QList search(const QString &query, const std::atomic_bool &canceled) const; QList relatedLinks(const QUrl &url) const; // FIXME: This a temporary solution to create URL on demand. diff --git a/src/libs/registry/docsetregistry.cpp b/src/libs/registry/docsetregistry.cpp index 99e1b2c1..8f48e69e 100644 --- a/src/libs/registry/docsetregistry.cpp +++ b/src/libs/registry/docsetregistry.cpp @@ -18,7 +18,6 @@ #include #include -#include namespace Zeal::Registry { @@ -200,7 +199,7 @@ QList DocsetRegistry::docsets() const void DocsetRegistry::search(const QString &query) { - m_cancellationToken.cancel(); + m_cancelSearch.store(true, std::memory_order_relaxed); if (query.isEmpty()) { emit searchCompleted({}); @@ -212,7 +211,7 @@ void DocsetRegistry::search(const QString &query) void DocsetRegistry::_runQuery(const QString &query) { - m_cancellationToken.reset(); + m_cancelSearch.store(false, std::memory_order_relaxed); QList enabledDocsets; @@ -227,22 +226,22 @@ void DocsetRegistry::_runQuery(const QString &query) enabledDocsets = docsets(); } - QFuture> queryResultsFuture = QtConcurrent::mappedReduced(enabledDocsets, - std::bind(&Docset::search, - std::placeholders::_1, - searchQuery.query(), - std::ref( - m_cancellationToken)), - &MergeQueryResults); - QList results = queryResultsFuture.result(); + const QString queryString = searchQuery.query(); + QFuture> queryFuture = QtConcurrent::mappedReduced(enabledDocsets, + std::bind(&Docset::search, + std::placeholders::_1, + queryString, + std::cref(m_cancelSearch)), + &MergeQueryResults); + QList results = queryFuture.result(); - if (m_cancellationToken.isCanceled()) { + if (m_cancelSearch.load(std::memory_order_relaxed)) { return; } std::sort(results.begin(), results.end()); - if (m_cancellationToken.isCanceled()) { + if (m_cancelSearch.load(std::memory_order_relaxed)) { return; } diff --git a/src/libs/registry/docsetregistry.h b/src/libs/registry/docsetregistry.h index 2542745e..edd43664 100644 --- a/src/libs/registry/docsetregistry.h +++ b/src/libs/registry/docsetregistry.h @@ -5,12 +5,13 @@ #ifndef ZEAL_REGISTRY_DOCSETREGISTRY_H #define ZEAL_REGISTRY_DOCSETREGISTRY_H -#include "cancellationtoken.h" #include "searchresult.h" #include #include +#include + class QAbstractItemModel; class QThread; @@ -70,7 +71,7 @@ private: QThread *m_thread = nullptr; QMap m_docsets; - CancellationToken m_cancellationToken; + std::atomic_bool m_cancelSearch{false}; }; } // namespace Zeal::Registry