QPluginLoader: report the right load hints
A default-constructed QPluginLoader erroneously reports that the load hints are empty. However, setting a filename would then automatically set the PreventUnload hint, surprising the user. Return the correct flags instead. Amends 494376f980e96339b6f1eff7c41336ca4d853065 Change-Id: I7a95964cb680afd3adf2f71ed73d2f93023238f2 Fixes: QTBUG-100416 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> (cherry picked from commit e7d627339cc35907c0d5bb263ede10a017e0b988) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
7374e9760b
commit
a633bc491f
@ -105,6 +105,8 @@ QT_BEGIN_NAMESPACE
|
||||
\sa QLibrary, {Plug & Paint Example}
|
||||
*/
|
||||
|
||||
static constexpr QLibrary::LoadHints defaultLoadHints = QLibrary::PreventUnloadHint;
|
||||
|
||||
/*!
|
||||
Constructs a plugin loader with the given \a parent.
|
||||
*/
|
||||
@ -128,7 +130,7 @@ QPluginLoader::QPluginLoader(const QString &fileName, QObject *parent)
|
||||
: QObject(parent), d(nullptr), did_load(false)
|
||||
{
|
||||
setFileName(fileName);
|
||||
setLoadHints(QLibrary::PreventUnloadHint);
|
||||
setLoadHints(defaultLoadHints);
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -329,7 +331,7 @@ static QString locatePlugin(const QString& fileName)
|
||||
void QPluginLoader::setFileName(const QString &fileName)
|
||||
{
|
||||
#if defined(QT_SHARED)
|
||||
QLibrary::LoadHints lh = QLibrary::PreventUnloadHint;
|
||||
QLibrary::LoadHints lh = defaultLoadHints;
|
||||
if (d) {
|
||||
lh = d->loadHints();
|
||||
d->release();
|
||||
@ -394,7 +396,12 @@ void QPluginLoader::setLoadHints(QLibrary::LoadHints loadHints)
|
||||
|
||||
QLibrary::LoadHints QPluginLoader::loadHints() const
|
||||
{
|
||||
return d ? d->loadHints() : QLibrary::LoadHints();
|
||||
// Not having a d-pointer means that the user hasn't called
|
||||
// setLoadHints() / setFileName() yet. In setFileName() we will
|
||||
// then force defaultLoadHints on loading, so we must return them
|
||||
// from here as well.
|
||||
|
||||
return d ? d->loadHints() : defaultLoadHints;
|
||||
}
|
||||
|
||||
#endif // QT_CONFIG(library)
|
||||
|
@ -245,10 +245,19 @@ void tst_QPluginLoader::loadHints()
|
||||
QSKIP("This test requires Qt to create shared libraries.");
|
||||
#endif
|
||||
QPluginLoader loader;
|
||||
QCOMPARE(loader.loadHints(), QLibrary::LoadHints{}); //Do not crash
|
||||
QCOMPARE(loader.loadHints(), QLibrary::PreventUnloadHint); //Do not crash
|
||||
loader.setLoadHints(QLibrary::ResolveAllSymbolsHint);
|
||||
QCOMPARE(loader.loadHints(), QLibrary::ResolveAllSymbolsHint);
|
||||
loader.setFileName( sys_qualifiedLibraryName("theplugin")); //a plugin
|
||||
QCOMPARE(loader.loadHints(), QLibrary::ResolveAllSymbolsHint);
|
||||
|
||||
QPluginLoader loader2;
|
||||
QCOMPARE(loader2.loadHints(), QLibrary::PreventUnloadHint);
|
||||
loader2.setFileName(sys_qualifiedLibraryName("theplugin"));
|
||||
QCOMPARE(loader2.loadHints(), QLibrary::PreventUnloadHint);
|
||||
|
||||
QPluginLoader loader3(sys_qualifiedLibraryName("theplugin"));
|
||||
QCOMPARE(loader3.loadHints(), QLibrary::PreventUnloadHint);
|
||||
}
|
||||
|
||||
void tst_QPluginLoader::deleteinstanceOnUnload()
|
||||
|
Loading…
x
Reference in New Issue
Block a user