diff options
Diffstat (limited to 'src/corelib/plugin')
| -rw-r--r-- | src/corelib/plugin/qfactoryloader.cpp | 6 | ||||
| -rw-r--r-- | src/corelib/plugin/qfactoryloader_p.h | 2 | ||||
| -rw-r--r-- | src/corelib/plugin/qlibrary_unix.cpp | 5 |
3 files changed, 13 insertions, 0 deletions
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp index 21e4c294c91..31abed73cf9 100644 --- a/src/corelib/plugin/qfactoryloader.cpp +++ b/src/corelib/plugin/qfactoryloader.cpp @@ -359,6 +359,11 @@ inline void QFactoryLoader::Private::updateSinglePath(const QString &path) loadedLibraries.resize(libraries.size()); } +void QFactoryLoader::setLoadHints(QLibrary::LoadHints loadHints) +{ + d->loadHints = loadHints; +} + void QFactoryLoader::update() { #ifdef QT_SHARED @@ -549,6 +554,7 @@ inline QObject *QFactoryLoader::instanceHelper_locked(int index) const if (size_t(index) < d->libraries.size()) { QLibraryPrivate *library = d->libraries[index].get(); d->loadedLibraries[index] = true; + library->setLoadHints(d->loadHints); return library->pluginInstance(); } // we know d->libraries.size() <= index <= numeric_limits<decltype(index)>::max() → no overflow diff --git a/src/corelib/plugin/qfactoryloader_p.h b/src/corelib/plugin/qfactoryloader_p.h index c14e5795a8f..d7482b36198 100644 --- a/src/corelib/plugin/qfactoryloader_p.h +++ b/src/corelib/plugin/qfactoryloader_p.h @@ -48,6 +48,7 @@ public: #if QT_CONFIG(library) ~QFactoryLoader(); + void setLoadHints(QLibrary::LoadHints hints); void update(); static void refreshAll(); @@ -79,6 +80,7 @@ private: QString suffix; QString extraSearchPath; Qt::CaseSensitivity cs; + QLibrary::LoadHints loadHints; void updateSinglePath(const QString &pluginDir); #endif diff --git a/src/corelib/plugin/qlibrary_unix.cpp b/src/corelib/plugin/qlibrary_unix.cpp index e629e2b1f12..f03eba3bffa 100644 --- a/src/corelib/plugin/qlibrary_unix.cpp +++ b/src/corelib/plugin/qlibrary_unix.cpp @@ -14,6 +14,11 @@ #ifdef Q_OS_DARWIN # include <private/qcore_mac_p.h> + +// Apple's dyld *does* support RTLD_NODELETE and the library remains loaded in +// memory after the dlclose() call, but their Objective C crashes when running +// code from unloaded-but-still-loaded plugins. +# undef RTLD_NODELETE #endif #ifdef Q_OS_ANDROID |
