From 05c267673f43ecbb0ae4c44adc7d02a690435f8b Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 2 Jul 2014 11:22:48 +0200 Subject: [PATCH] Fix crash with "Files in Any/Current Project" locator filters They were calling thread-unsafe API from a non-GUI thread. Task-number: QTCREATORBUG-12592 Change-Id: I029eebae341643060ca1d1a685e2a5730f9cf964 Reviewed-by: Christian Kandeler --- src/plugins/coreplugin/locator/basefilefilter.h | 1 + src/plugins/projectexplorer/allprojectsfilter.cpp | 9 +++++++-- src/plugins/projectexplorer/allprojectsfilter.h | 1 + src/plugins/projectexplorer/currentprojectfilter.cpp | 9 +++++++-- src/plugins/projectexplorer/currentprojectfilter.h | 1 + 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/plugins/coreplugin/locator/basefilefilter.h b/src/plugins/coreplugin/locator/basefilefilter.h index 44102b30e4e..b8e95dc06f0 100644 --- a/src/plugins/coreplugin/locator/basefilefilter.h +++ b/src/plugins/coreplugin/locator/basefilefilter.h @@ -46,6 +46,7 @@ public: void accept(Core::LocatorFilterEntry selection) const; protected: + // runs in non-UI thread virtual void updateFiles(); void generateFileNames(); diff --git a/src/plugins/projectexplorer/allprojectsfilter.cpp b/src/plugins/projectexplorer/allprojectsfilter.cpp index fd4b44e9ed3..6972b25daa7 100644 --- a/src/plugins/projectexplorer/allprojectsfilter.cpp +++ b/src/plugins/projectexplorer/allprojectsfilter.cpp @@ -55,16 +55,21 @@ void AllProjectsFilter::markFilesAsOutOfDate() m_filesUpToDate = false; } -void AllProjectsFilter::updateFiles() +void AllProjectsFilter::updateFilesImpl() { if (m_filesUpToDate) return; - m_filesUpToDate = true; files().clear(); foreach (Project *project, SessionManager::projects()) files().append(project->files(Project::AllFiles)); Utils::sort(files()); generateFileNames(); + m_filesUpToDate = true; +} + +void AllProjectsFilter::updateFiles() +{ + QMetaObject::invokeMethod(this, "updateFilesImpl", Qt::BlockingQueuedConnection); } void AllProjectsFilter::refresh(QFutureInterface &future) diff --git a/src/plugins/projectexplorer/allprojectsfilter.h b/src/plugins/projectexplorer/allprojectsfilter.h index 0e5b79b5617..1d12e6d54d0 100644 --- a/src/plugins/projectexplorer/allprojectsfilter.h +++ b/src/plugins/projectexplorer/allprojectsfilter.h @@ -50,6 +50,7 @@ protected: private slots: void markFilesAsOutOfDate(); + void updateFilesImpl(); private: bool m_filesUpToDate; diff --git a/src/plugins/projectexplorer/currentprojectfilter.cpp b/src/plugins/projectexplorer/currentprojectfilter.cpp index 50917bb598f..2a04772e98b 100644 --- a/src/plugins/projectexplorer/currentprojectfilter.cpp +++ b/src/plugins/projectexplorer/currentprojectfilter.cpp @@ -57,17 +57,22 @@ void CurrentProjectFilter::markFilesAsOutOfDate() m_filesUpToDate = false; } -void CurrentProjectFilter::updateFiles() +void CurrentProjectFilter::updateFilesImpl() { if (m_filesUpToDate) return; - m_filesUpToDate = true; files().clear(); if (!m_project) return; files() = m_project->files(Project::AllFiles); Utils::sort(files()); generateFileNames(); + m_filesUpToDate = true; +} + +void CurrentProjectFilter::updateFiles() +{ + QMetaObject::invokeMethod(this, "updateFilesImpl", Qt::BlockingQueuedConnection); } void CurrentProjectFilter::currentProjectChanged(ProjectExplorer::Project *project) diff --git a/src/plugins/projectexplorer/currentprojectfilter.h b/src/plugins/projectexplorer/currentprojectfilter.h index 25fe85a8acc..f1a9a5f682a 100644 --- a/src/plugins/projectexplorer/currentprojectfilter.h +++ b/src/plugins/projectexplorer/currentprojectfilter.h @@ -54,6 +54,7 @@ protected: private slots: void currentProjectChanged(ProjectExplorer::Project *project); void markFilesAsOutOfDate(); + void updateFilesImpl(); private: Project *m_project;