Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.3:Rings:1-MinimalX
libqt5-qtbase
Stop-unloading-plugins-in-QPluginLoader-and-QFa...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File Stop-unloading-plugins-in-QPluginLoader-and-QFactoryLoader.patch of Package libqt5-qtbase
From 8081ab4938b192bb740c5ee3004468aa6840563d Mon Sep 17 00:00:00 2001 From: Thiago Macieira <thiago.macieira@intel.com> Date: Thu, 12 Nov 2015 10:14:51 -0800 Subject: [PATCH] Stop unloading plugins in QPluginLoader and QFactoryLoader QPluginLoader hasn't unloaded in its destructor since Qt 5.0, but we missed the equivalent code in QFactoryLoader (which bypasses QPluginLoader). Besides, QPluginLoader::unload() was still doing unloading, which it won't anymore. Not unloading plugins is Qt's policy, as decided during the 5.0 development process and reaffirmed now in 5.6. This is due to static data in plugins leaking out and remaining in use past the unloading of the plugin, causing crashes. This does not affect QLibrary and QLibrary::unload(). Those are meant for non-Qt loadable modules, so unloading them may be safe. Task-number: QTBUG-49061 Task-number: QTBUG-52988 Discussed-on: http://lists.qt-project.org/pipermail/development/2015-November/023681.html Change-Id: I6b3a1770e6c79cc4485a28ab286e069b88a149e5 --- src/corelib/plugin/qfactoryloader.cpp | 6 ++++-- src/corelib/plugin/qpluginloader.cpp | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp index dcf1b1a..b6558f5 100644 --- a/src/corelib/plugin/qfactoryloader.cpp +++ b/src/corelib/plugin/qfactoryloader.cpp @@ -208,10 +208,12 @@ void QFactoryLoader::update() ++keyUsageCount; } } - if (keyUsageCount || keys.isEmpty()) + if (keyUsageCount || keys.isEmpty()) { + library->setLoadHints(QLibrary::PreventUnloadHint); // once loaded, don't unload d->libraryList += library; - else + } else { library->release(); + } } } #else diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp index 37f2368..0ea8280 100644 --- a/src/corelib/plugin/qpluginloader.cpp +++ b/src/corelib/plugin/qpluginloader.cpp @@ -148,6 +148,7 @@ QPluginLoader::QPluginLoader(const QString &fileName, QObject *parent) : QObject(parent), d(0), did_load(false) { setFileName(fileName); + setLoadHints(QLibrary::PreventUnloadHint); } /*! @@ -342,7 +343,7 @@ static QString locatePlugin(const QString& fileName) void QPluginLoader::setFileName(const QString &fileName) { #if defined(QT_SHARED) - QLibrary::LoadHints lh; + QLibrary::LoadHints lh = QLibrary::PreventUnloadHint; if (d) { lh = d->loadHints(); d->release(); @@ -391,7 +392,7 @@ Q_GLOBAL_STATIC(StaticPluginList, staticPluginList) \brief Give the load() function some hints on how it should behave. You can give hints on how the symbols in the plugin are - resolved. By default, none of the hints are set. + resolved. By default since Qt 5.7, QLibrary::PreventUnloadHint is set. See the documentation of QLibrary::loadHints for a complete description of how this property works. -- 2.7.4
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor