8b9e88c08a
The Time Has Come to Shoot You Down... What a Sound OBS-URL: https://build.opensuse.org/request/show/431274 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libqt5-qtbase?expand=0&rev=56
79 lines
3.0 KiB
Diff
79 lines
3.0 KiB
Diff
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
|