From 72bddf9f51fedd064f551bcb4ced5feeb46fdfc1 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 25 Apr 2023 14:07:03 +0200 Subject: [PATCH] PluginManager: Introduce global future synchronizer The global synchronizer will be destructed after the asynchronous shutdown phase and prior to deleting all the plugins (i.e. synchronously). It's assumed that between deleting the synchronizer and the point when all plugin destructors are finished no new futures are added to the global future synchronizer. Change-Id: Ibc839b04f2c2bbd35980b8baed51b29c2c4f7c76 Reviewed-by: Eike Ziller --- src/libs/extensionsystem/pluginmanager.cpp | 9 +++++++++ src/libs/extensionsystem/pluginmanager.h | 4 ++++ src/libs/extensionsystem/pluginmanager_p.h | 2 ++ 3 files changed, 15 insertions(+) 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;