diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp index aec053b6a8f..9d478453ea9 100644 --- a/src/libs/extensionsystem/pluginmanager.cpp +++ b/src/libs/extensionsystem/pluginmanager.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -422,6 +423,11 @@ QString PluginManager::systemInformation() return result; } +static FutureSynchronizer *futureSynchronizer() +{ + return d->m_futureSynchronizer.get(); +} + /*! The list of paths were the plugin manager searches for plugins. @@ -976,6 +982,8 @@ void PluginManagerPrivate::nextDelayedInitialize() PluginManagerPrivate::PluginManagerPrivate(PluginManager *pluginManager) : q(pluginManager) { + m_futureSynchronizer.reset(new FutureSynchronizer); + m_futureSynchronizer->setCancelOnWait(true); } @@ -1043,6 +1051,7 @@ void PluginManagerPrivate::stopAll() */ void PluginManagerPrivate::deleteAll() { + m_futureSynchronizer.reset(); // Synchronize all futures from all plugins Utils::reverseForeach(loadQueue(), [this](PluginSpec *spec) { loadPlugin(spec, PluginSpec::Deleted); }); diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h index 8dac9544cca..a56cb7ba9d4 100644 --- a/src/libs/extensionsystem/pluginmanager.h +++ b/src/libs/extensionsystem/pluginmanager.h @@ -15,6 +15,8 @@ QT_BEGIN_NAMESPACE class QTextStream; QT_END_NAMESPACE +namespace Utils { class FutureSynchronizer; } + namespace ExtensionSystem { class IPlugin; class PluginSpec; @@ -133,6 +135,8 @@ public: static QString systemInformation(); + static Utils::FutureSynchronizer *futureSynchronizer(); + signals: void objectAdded(QObject *obj); void aboutToRemoveObject(QObject *obj); diff --git a/src/libs/extensionsystem/pluginmanager_p.h b/src/libs/extensionsystem/pluginmanager_p.h index decd6271778..86c3a6c3624 100644 --- a/src/libs/extensionsystem/pluginmanager_p.h +++ b/src/libs/extensionsystem/pluginmanager_p.h @@ -26,6 +26,7 @@ class QEventLoop; QT_END_NAMESPACE namespace Utils { +class FutureSynchronizer; class QtcSettings; } @@ -133,6 +134,7 @@ public: QWaitCondition m_scenarioWaitCondition; PluginManager::ProcessData m_creatorProcessData; + std::unique_ptr m_futureSynchronizer; private: PluginManager *q;