78 lines
3.1 KiB
Diff
78 lines
3.1 KiB
Diff
From 494376f980e96339b6f1eff7c41336ca4d853065 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
|
|
Discussed-on: http://lists.qt-project.org/pipermail/development/2015-November/023681.html
|
|
Change-Id: I461e9fc7199748faa187ffff1416070f138df8db
|
|
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
|
|
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
|
|
---
|
|
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 53b38c3..c820d53 100644
|
|
--- a/src/corelib/plugin/qfactoryloader.cpp
|
|
+++ b/src/corelib/plugin/qfactoryloader.cpp
|
|
@@ -203,10 +203,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 62067c7..4752f69 100644
|
|
--- a/src/corelib/plugin/qpluginloader.cpp
|
|
+++ b/src/corelib/plugin/qpluginloader.cpp
|
|
@@ -154,6 +154,7 @@ QPluginLoader::QPluginLoader(const QString &fileName, QObject *parent)
|
|
: QObject(parent), d(0), did_load(false)
|
|
{
|
|
setFileName(fileName);
|
|
+ setLoadHints(QLibrary::PreventUnloadHint);
|
|
}
|
|
|
|
/*!
|
|
@@ -348,7 +349,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();
|
|
@@ -394,7 +395,7 @@ QString QPluginLoader::errorString() const
|
|
\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.
|