diff options
author | liamwhite <liamwhite@users.noreply.github.com> | 2023-10-13 15:29:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-13 15:29:13 +0200 |
commit | 1a4874e178860d723760d98be337cd4640b06a30 (patch) | |
tree | afe20068da407a90e3ec5b38e3d8ae02a5afb2cd | |
parent | Merge pull request #11766 from liamwhite/open-sesame (diff) | |
parent | qt: ensure worker cancellation is complete before clearing (diff) | |
download | yuzu-1a4874e178860d723760d98be337cd4640b06a30.tar yuzu-1a4874e178860d723760d98be337cd4640b06a30.tar.gz yuzu-1a4874e178860d723760d98be337cd4640b06a30.tar.bz2 yuzu-1a4874e178860d723760d98be337cd4640b06a30.tar.lz yuzu-1a4874e178860d723760d98be337cd4640b06a30.tar.xz yuzu-1a4874e178860d723760d98be337cd4640b06a30.tar.zst yuzu-1a4874e178860d723760d98be337cd4640b06a30.zip |
-rw-r--r-- | src/yuzu/game_list.cpp | 5 | ||||
-rw-r--r-- | src/yuzu/game_list_worker.cpp | 7 | ||||
-rw-r--r-- | src/yuzu/game_list_worker.h | 5 |
3 files changed, 11 insertions, 6 deletions
diff --git a/src/yuzu/game_list.cpp b/src/yuzu/game_list.cpp index 74f48031a..2bb1a0239 100644 --- a/src/yuzu/game_list.cpp +++ b/src/yuzu/game_list.cpp @@ -826,12 +826,13 @@ void GameList::PopulateAsync(QVector<UISettings::GameDir>& game_dirs) { tree_view->setColumnHidden(COLUMN_SIZE, !UISettings::values.show_size); tree_view->setColumnHidden(COLUMN_PLAY_TIME, !UISettings::values.show_play_time); + // Before deleting rows, cancel the worker so that it is not using them + emit ShouldCancelWorker(); + // Delete any rows that might already exist if we're repopulating item_model->removeRows(0, item_model->rowCount()); search_field->clear(); - emit ShouldCancelWorker(); - GameListWorker* worker = new GameListWorker(vfs, provider, game_dirs, compatibility_list, play_time_manager, system); diff --git a/src/yuzu/game_list_worker.cpp b/src/yuzu/game_list_worker.cpp index 588f1dd6e..077ced12b 100644 --- a/src/yuzu/game_list_worker.cpp +++ b/src/yuzu/game_list_worker.cpp @@ -293,7 +293,7 @@ void GameListWorker::AddTitlesToGameList(GameListDir* parent_dir) { void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_path, bool deep_scan, GameListDir* parent_dir) { const auto callback = [this, target, parent_dir](const std::filesystem::path& path) -> bool { - if (stop_processing) { + if (stop_requested) { // Breaks the callback loop. return false; } @@ -399,7 +399,6 @@ void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_pa } void GameListWorker::run() { - stop_processing = false; provider->ClearAllEntries(); for (UISettings::GameDir& game_dir : game_dirs) { @@ -427,9 +426,11 @@ void GameListWorker::run() { } emit Finished(watch_list); + processing_completed.Set(); } void GameListWorker::Cancel() { this->disconnect(); - stop_processing = true; + stop_requested.store(true); + processing_completed.Wait(); } diff --git a/src/yuzu/game_list_worker.h b/src/yuzu/game_list_worker.h index 2bb0a0cb6..54dc05e30 100644 --- a/src/yuzu/game_list_worker.h +++ b/src/yuzu/game_list_worker.h @@ -12,6 +12,7 @@ #include <QRunnable> #include <QString> +#include "common/thread.h" #include "yuzu/compatibility_list.h" #include "yuzu/play_time_manager.h" @@ -82,7 +83,9 @@ private: const PlayTime::PlayTimeManager& play_time_manager; QStringList watch_list; - std::atomic_bool stop_processing; + + Common::Event processing_completed; + std::atomic_bool stop_requested = false; Core::System& system; }; |