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>
This commit is contained in:
parent
2fbcc18309
commit
6c6b342061
@ -152,9 +152,17 @@ public:
|
|||||||
static Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE(lcFactoryLoader, "QT_DEBUG_PLUGINS",
|
static Q_LOGGING_CATEGORY_WITH_ENV_OVERRIDE(lcFactoryLoader, "QT_DEBUG_PLUGINS",
|
||||||
"qt.core.plugin.factoryloader")
|
"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()
|
QFactoryLoaderPrivate::~QFactoryLoaderPrivate()
|
||||||
{
|
{
|
||||||
@ -284,8 +292,10 @@ void QFactoryLoader::update()
|
|||||||
|
|
||||||
QFactoryLoader::~QFactoryLoader()
|
QFactoryLoader::~QFactoryLoader()
|
||||||
{
|
{
|
||||||
QMutexLocker locker(qt_factoryloader_mutex());
|
if (!qt_factoryloader_global.isDestroyed()) {
|
||||||
qt_factory_loaders()->removeOne(this);
|
QMutexLocker locker(&qt_factoryloader_global->mutex);
|
||||||
|
qt_factoryloader_global->loaders.removeOne(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(Q_OS_UNIX) && !defined (Q_OS_MAC)
|
#if defined(Q_OS_UNIX) && !defined (Q_OS_MAC)
|
||||||
@ -298,11 +308,10 @@ QLibraryPrivate *QFactoryLoader::library(const QString &key) const
|
|||||||
|
|
||||||
void QFactoryLoader::refreshAll()
|
void QFactoryLoader::refreshAll()
|
||||||
{
|
{
|
||||||
QMutexLocker locker(qt_factoryloader_mutex());
|
if (qt_factoryloader_global.exists()) {
|
||||||
QList<QFactoryLoader *> *loaders = qt_factory_loaders();
|
QMutexLocker locker(&qt_factoryloader_global->mutex);
|
||||||
for (QList<QFactoryLoader *>::const_iterator it = loaders->constBegin();
|
for (QFactoryLoader *loader : std::as_const(qt_factoryloader_global->loaders))
|
||||||
it != loaders->constEnd(); ++it) {
|
loader->update();
|
||||||
(*it)->update();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -327,9 +336,9 @@ QFactoryLoader::QFactoryLoader(const char *iid,
|
|||||||
d->suffix.remove(0, 1);
|
d->suffix.remove(0, 1);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
QMutexLocker locker(qt_factoryloader_mutex());
|
QMutexLocker locker(&qt_factoryloader_global->mutex);
|
||||||
update();
|
update();
|
||||||
qt_factory_loaders()->append(this);
|
qt_factoryloader_global->loaders.append(this);
|
||||||
#else
|
#else
|
||||||
Q_UNUSED(suffix);
|
Q_UNUSED(suffix);
|
||||||
Q_UNUSED(cs);
|
Q_UNUSED(cs);
|
||||||
@ -343,7 +352,7 @@ void QFactoryLoader::setExtraSearchPath(const QString &path)
|
|||||||
if (d->extraSearchPath == path)
|
if (d->extraSearchPath == path)
|
||||||
return; // nothing to do
|
return; // nothing to do
|
||||||
|
|
||||||
QMutexLocker locker(qt_factoryloader_mutex());
|
QMutexLocker locker(&qt_factoryloader_global->mutex);
|
||||||
QString oldPath = qExchange(d->extraSearchPath, path);
|
QString oldPath = qExchange(d->extraSearchPath, path);
|
||||||
if (oldPath.isEmpty()) {
|
if (oldPath.isEmpty()) {
|
||||||
// easy case, just update this directory
|
// easy case, just update this directory
|
||||||
|
Loading…
x
Reference in New Issue
Block a user