summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2021-11-09 13:54:18 -0800
committerEdward Welbourne <edward.welbourne@qt.io>2022-01-21 00:53:49 +0100
commit6c6b34206143edf77308c31ca2d68460c5c1c320 (patch)
tree6ac458c7d5bea3367268d7a1d9d1d7e9a6ce9341 /src
parent2fbcc1830978791ccac3b46c51d91b4363bd8cf8 (diff)
QFactoryLoader: merge the global statics into a single struct
Drive-by update one more for to ranged-for and make sure we don't create the global statics on destruction. Change-Id: I5e52dc5b093c43a3b678fffd16b5ff674dfd17ae Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/plugin/qfactoryloader.cpp33
1 files changed, 21 insertions, 12 deletions
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp
index 0128fdf623..2c269aa183 100644
--- a/src/corelib/plugin/qfactoryloader.cpp
+++ b/src/corelib/plugin/qfactoryloader.cpp
@@ -152,9 +152,17 @@ public:
static Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE(lcFactoryLoader, "QT_DEBUG_PLUGINS",
"qt.core.plugin.factoryloader")
-Q_GLOBAL_STATIC(QList<QFactoryLoader *>, qt_factory_loaders)
+namespace {
+struct QFactoryLoaderGlobals
+{
+ // needs to be recursive because loading one plugin could cause another
+ // factory to be initialized
+ QRecursiveMutex mutex;
+ QList<QFactoryLoader *> loaders;
+};
+}
-Q_GLOBAL_STATIC(QRecursiveMutex, qt_factoryloader_mutex)
+Q_GLOBAL_STATIC(QFactoryLoaderGlobals, qt_factoryloader_global)
QFactoryLoaderPrivate::~QFactoryLoaderPrivate()
{
@@ -284,8 +292,10 @@ void QFactoryLoader::update()
QFactoryLoader::~QFactoryLoader()
{
- QMutexLocker locker(qt_factoryloader_mutex());
- qt_factory_loaders()->removeOne(this);
+ if (!qt_factoryloader_global.isDestroyed()) {
+ QMutexLocker locker(&qt_factoryloader_global->mutex);
+ qt_factoryloader_global->loaders.removeOne(this);
+ }
}
#if defined(Q_OS_UNIX) && !defined (Q_OS_MAC)
@@ -298,11 +308,10 @@ QLibraryPrivate *QFactoryLoader::library(const QString &key) const
void QFactoryLoader::refreshAll()
{
- QMutexLocker locker(qt_factoryloader_mutex());
- QList<QFactoryLoader *> *loaders = qt_factory_loaders();
- for (QList<QFactoryLoader *>::const_iterator it = loaders->constBegin();
- it != loaders->constEnd(); ++it) {
- (*it)->update();
+ if (qt_factoryloader_global.exists()) {
+ QMutexLocker locker(&qt_factoryloader_global->mutex);
+ for (QFactoryLoader *loader : std::as_const(qt_factoryloader_global->loaders))
+ loader->update();
}
}
@@ -327,9 +336,9 @@ QFactoryLoader::QFactoryLoader(const char *iid,
d->suffix.remove(0, 1);
# endif
- QMutexLocker locker(qt_factoryloader_mutex());
+ QMutexLocker locker(&qt_factoryloader_global->mutex);
update();
- qt_factory_loaders()->append(this);
+ qt_factoryloader_global->loaders.append(this);
#else
Q_UNUSED(suffix);
Q_UNUSED(cs);
@@ -343,7 +352,7 @@ void QFactoryLoader::setExtraSearchPath(const QString &path)
if (d->extraSearchPath == path)
return; // nothing to do
- QMutexLocker locker(qt_factoryloader_mutex());
+ QMutexLocker locker(&qt_factoryloader_global->mutex);
QString oldPath = qExchange(d->extraSearchPath, path);
if (oldPath.isEmpty()) {
// easy case, just update this directory