diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2021-11-09 13:54:18 -0800 |
---|---|---|
committer | Edward Welbourne <edward.welbourne@qt.io> | 2022-01-21 00:53:49 +0100 |
commit | 6c6b34206143edf77308c31ca2d68460c5c1c320 (patch) | |
tree | 6ac458c7d5bea3367268d7a1d9d1d7e9a6ce9341 /src/corelib | |
parent | 2fbcc1830978791ccac3b46c51d91b4363bd8cf8 (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/corelib')
-rw-r--r-- | src/corelib/plugin/qfactoryloader.cpp | 33 |
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 |