diff --git a/src/corelib/kernel/qpermissions_darwin.mm b/src/corelib/kernel/qpermissions_darwin.mm index ed45899543a..9753fc38845 100644 --- a/src/corelib/kernel/qpermissions_darwin.mm +++ b/src/corelib/kernel/qpermissions_darwin.mm @@ -38,14 +38,6 @@ QPermissionPlugin *permissionPlugin(const QPermission &permission) auto className = metaDataList.at(i).value(QtPluginMetaDataKeys::ClassName).toString(); qCDebug(lcPermissions) << "Found matching plugin" << qUtf8Printable(className); auto *plugin = static_cast(pluginLoader()->instance(i)); - if (!plugin->parent()) { - // Also, as setParent will involve sending a ChildAdded event to the parent, - // we need to make the call on the same thread as the parent lives, as events - // are not allowed to be sent to an object owned by another thread. - QMetaObject::invokeMethod(plugin, [=] { - plugin->setParent(pluginLoader); - }); - } return plugin; } } diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp index a7ce5994213..d0bb673e537 100644 --- a/src/corelib/plugin/qfactoryloader.cpp +++ b/src/corelib/plugin/qfactoryloader.cpp @@ -257,6 +257,7 @@ public: QFactoryLoaderPrivate() { } QByteArray iid; mutable QMutex mutex; + mutable QList usedStaticInstances; #if QT_CONFIG(library) ~QFactoryLoaderPrivate(); QDuplicateTracker loadedPaths; @@ -438,6 +439,11 @@ QFactoryLoader::~QFactoryLoader() } } #endif + + for (QtPluginInstanceFunction staticInstance : d->usedStaticInstances) { + if (staticInstance) + delete staticInstance(); + } } #if defined(Q_OS_UNIX) && !defined (Q_OS_DARWIN) @@ -604,14 +610,19 @@ inline QObject *QFactoryLoader::instanceHelper_locked(int index) const QLatin1StringView iid(d->iid.constData(), d->iid.size()); const QList staticPlugins = QPluginLoader::staticPlugins(); + qsizetype i = 0; for (QStaticPlugin plugin : staticPlugins) { QByteArrayView pluginData(static_cast(plugin.rawMetaData), plugin.rawMetaDataSize); if (!isIidMatch(pluginData, iid)) continue; - if (index == 0) + if (i == index) { + if (d->usedStaticInstances.size() <= i) + d->usedStaticInstances.resize(i + 1); + d->usedStaticInstances[i] = plugin.instance; return plugin.instance(); - --index; + } + ++i; } return nullptr;