mirror of
https://github.com/zealdocs/zeal.git
synced 2026-08-29 08:34:50 +08:00
refactor(registry): drop CancellationToken (#1820)
Replace the CancellationToken class with a plain std::atomic_bool member in DocsetRegistry.
This commit is contained in:
@@ -7,7 +7,6 @@ add_library(Registry STATIC
|
||||
searchquery.cpp
|
||||
|
||||
# Show headers without .cpp in Qt Creator.
|
||||
cancellationtoken.h
|
||||
itemdatarole.h
|
||||
searchresult.h
|
||||
)
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
// Copyright (C) Oleg Shparber, et al. <https://zealdocs.org>
|
||||
// Copyright (C) 2015 Artur Spychaj
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#ifndef ZEAL_REGISTRY_CANCELLATIONTOKEN_H
|
||||
#define ZEAL_REGISTRY_CANCELLATIONTOKEN_H
|
||||
|
||||
#include <atomic>
|
||||
|
||||
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
|
||||
@@ -4,7 +4,6 @@
|
||||
|
||||
#include "docset.h"
|
||||
|
||||
#include "cancellationtoken.h"
|
||||
#include "searchresult.h"
|
||||
|
||||
#include <util/fuzzy.h>
|
||||
@@ -310,7 +309,7 @@ const QMultiMap<QString, QUrl> &Docset::symbols(const QString &symbolType) const
|
||||
return m_symbols[symbolType];
|
||||
}
|
||||
|
||||
QList<SearchResult> Docset::search(const QString &query, const CancellationToken &token) const
|
||||
QList<SearchResult> Docset::search(const QString &query, const std::atomic_bool &canceled) const
|
||||
{
|
||||
QString sql;
|
||||
if (m_type == Docset::Type::Dash) {
|
||||
@@ -351,7 +350,7 @@ QList<SearchResult> Docset::search(const QString &query, const CancellationToken
|
||||
m_db->prepare(sql.arg(sanitizedQuery));
|
||||
|
||||
QList<SearchResult> 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());
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
#include <QMultiMap>
|
||||
#include <QUrl>
|
||||
|
||||
#include <atomic>
|
||||
|
||||
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<QString, QUrl> &symbols(const QString &symbolType) const;
|
||||
|
||||
QList<SearchResult> search(const QString &query, const CancellationToken &token) const;
|
||||
QList<SearchResult> search(const QString &query, const std::atomic_bool &canceled) const;
|
||||
QList<SearchResult> relatedLinks(const QUrl &url) const;
|
||||
|
||||
// FIXME: This a temporary solution to create URL on demand.
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
#include <QtConcurrent>
|
||||
|
||||
#include <functional>
|
||||
#include <future>
|
||||
|
||||
namespace Zeal::Registry {
|
||||
|
||||
@@ -200,7 +199,7 @@ QList<Docset *> 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<Docset *> enabledDocsets;
|
||||
|
||||
@@ -227,22 +226,22 @@ void DocsetRegistry::_runQuery(const QString &query)
|
||||
enabledDocsets = docsets();
|
||||
}
|
||||
|
||||
QFuture<QList<SearchResult>> queryResultsFuture = QtConcurrent::mappedReduced(enabledDocsets,
|
||||
std::bind(&Docset::search,
|
||||
std::placeholders::_1,
|
||||
searchQuery.query(),
|
||||
std::ref(
|
||||
m_cancellationToken)),
|
||||
&MergeQueryResults);
|
||||
QList<SearchResult> results = queryResultsFuture.result();
|
||||
const QString queryString = searchQuery.query();
|
||||
QFuture<QList<SearchResult>> queryFuture = QtConcurrent::mappedReduced(enabledDocsets,
|
||||
std::bind(&Docset::search,
|
||||
std::placeholders::_1,
|
||||
queryString,
|
||||
std::cref(m_cancelSearch)),
|
||||
&MergeQueryResults);
|
||||
QList<SearchResult> 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,12 +5,13 @@
|
||||
#ifndef ZEAL_REGISTRY_DOCSETREGISTRY_H
|
||||
#define ZEAL_REGISTRY_DOCSETREGISTRY_H
|
||||
|
||||
#include "cancellationtoken.h"
|
||||
#include "searchresult.h"
|
||||
|
||||
#include <QMap>
|
||||
#include <QObject>
|
||||
|
||||
#include <atomic>
|
||||
|
||||
class QAbstractItemModel;
|
||||
class QThread;
|
||||
|
||||
@@ -70,7 +71,7 @@ private:
|
||||
QThread *m_thread = nullptr;
|
||||
QMap<QString, Docset *> m_docsets;
|
||||
|
||||
CancellationToken m_cancellationToken;
|
||||
std::atomic_bool m_cancelSearch{false};
|
||||
};
|
||||
|
||||
} // namespace Zeal::Registry
|
||||
|
||||
Reference in New Issue
Block a user