diff --git a/src/libs/utils/asynctask.h b/src/libs/utils/asynctask.h index bb537cef168..e035977401b 100644 --- a/src/libs/utils/asynctask.h +++ b/src/libs/utils/asynctask.h @@ -66,8 +66,9 @@ public: bool isCanceled() const { return m_watcher.isCanceled(); } QFuture future() const { return m_watcher.future(); } - ResultType result() const { return m_watcher.result(); } // TODO: warn when isRunning? - QList results() const { return m_watcher.future().results(); } + ResultType result() const { return m_watcher.result(); } + QList results() const { return future().results(); } + bool isResultAvailable() const { return future().resultCount(); } private: StartHandler m_startHandler; diff --git a/src/plugins/cppeditor/cppprojectupdater.cpp b/src/plugins/cppeditor/cppprojectupdater.cpp index 91bcd943b12..a784d3bb794 100644 --- a/src/plugins/cppeditor/cppprojectupdater.cpp +++ b/src/plugins/cppeditor/cppprojectupdater.cpp @@ -67,7 +67,8 @@ void CppProjectUpdater::update(const ProjectUpdateInfo &projectUpdateInfo, async.setFutureSynchronizer(&m_futureSynchronizer); }; const auto onInfoGeneratorDone = [=](const AsyncTask &async) { - storage->projectInfo = async.result(); + if (async.isResultAvailable()) + storage->projectInfo = async.result(); }; QList tasks{parallel}; tasks.append(Async(setupInfoGenerator, onInfoGeneratorDone)); diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp index e18a0e27972..2a813206657 100644 --- a/src/plugins/diffeditor/diffeditorplugin.cpp +++ b/src/plugins/diffeditor/diffeditorplugin.cpp @@ -109,24 +109,25 @@ DiffFilesController::DiffFilesController(IDocument *document) setDisplayName(Tr::tr("Diff")); using namespace Tasking; - const TreeStorage> storage; + const TreeStorage>> storage; const auto setupTree = [this, storage](TaskTree &taskTree) { - QList *outputList = storage.activeStorage(); + QList> *outputList = storage.activeStorage(); const auto setupDiff = [this](AsyncTask &async, const ReloadInput &reloadInput) { async.setAsyncCallData(DiffFile(ignoreWhitespace(), contextLineCount()), reloadInput); async.setFutureSynchronizer(Internal::DiffEditorPlugin::futureSynchronizer()); }; const auto onDiffDone = [outputList](const AsyncTask &async, int i) { - (*outputList)[i] = async.result(); + if (async.isResultAvailable()) + (*outputList)[i] = async.result(); }; const QList inputList = reloadInputList(); outputList->resize(inputList.size()); using namespace std::placeholders; - QList tasks {parallel, continueOnDone}; + QList tasks {parallel, optional}; for (int i = 0; i < inputList.size(); ++i) { tasks.append(Async(std::bind(setupDiff, _1, inputList.at(i)), std::bind(onDiffDone, _1, i))); @@ -134,7 +135,13 @@ DiffFilesController::DiffFilesController(IDocument *document) taskTree.setupRoot(tasks); }; const auto onTreeDone = [this, storage] { - setDiffFiles(*storage.activeStorage()); + const QList> &results = *storage.activeStorage(); + QList finalList; + for (const std::optional &result : results) { + if (result.has_value()) + finalList.append(*result); + } + setDiffFiles(finalList); }; const auto onTreeError = [this, storage] { setDiffFiles({}); diff --git a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp index 5bc887b90aa..da69e607840 100644 --- a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp +++ b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp @@ -874,7 +874,7 @@ void SideBySideDiffEditorWidget::showDiff() m_controller.setBusyShowing(true); connect(m_asyncTask.get(), &AsyncTaskBase::done, this, [this] { - if (m_asyncTask->isCanceled()) { + if (m_asyncTask->isCanceled() || !m_asyncTask->isResultAvailable()) { for (SideDiffEditorWidget *editor : m_editor) editor->clearAll(Tr::tr("Retrieving data failed.")); } else { diff --git a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp index 8c8bee05c27..b937b919f7c 100644 --- a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp +++ b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp @@ -458,7 +458,7 @@ void UnifiedDiffEditorWidget::showDiff() m_asyncTask->setFutureSynchronizer(DiffEditorPlugin::futureSynchronizer()); m_controller.setBusyShowing(true); connect(m_asyncTask.get(), &AsyncTaskBase::done, this, [this] { - if (m_asyncTask->isCanceled()) { + if (m_asyncTask->isCanceled() || !m_asyncTask->isResultAvailable()) { setPlainText(Tr::tr("Retrieving data failed.")); } else { const ShowResult result = m_asyncTask->result(); diff --git a/src/plugins/projectexplorer/extracompiler.cpp b/src/plugins/projectexplorer/extracompiler.cpp index ff7c061790e..ab72d3608ff 100644 --- a/src/plugins/projectexplorer/extracompiler.cpp +++ b/src/plugins/projectexplorer/extracompiler.cpp @@ -340,7 +340,7 @@ Tasking::TaskItem ProcessExtraCompiler::taskItemImpl(const ContentProvider &prov async.setFutureSynchronizer(futureSynchronizer()); }; const auto taskDone = [=](const AsyncTask &async) { - if (async.results().size() == 0) + if (!async.isResultAvailable()) return; const FileNameToContentsHash data = async.result(); if (data.isEmpty())