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}
|
\sa QLibrary, {Plug & Paint Example}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static constexpr QLibrary::LoadHints defaultLoadHints = QLibrary::PreventUnloadHint;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Constructs a plugin loader with the given \a parent.
|
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)
|
: QObject(parent), d(nullptr), did_load(false)
|
||||||
{
|
{
|
||||||
setFileName(fileName);
|
setFileName(fileName);
|
||||||
setLoadHints(QLibrary::PreventUnloadHint);
|
setLoadHints(defaultLoadHints);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -329,7 +331,7 @@ static QString locatePlugin(const QString& fileName)
|
|||||||
void QPluginLoader::setFileName(const QString &fileName)
|
void QPluginLoader::setFileName(const QString &fileName)
|
||||||
{
|
{
|
||||||
#if defined(QT_SHARED)
|
#if defined(QT_SHARED)
|
||||||
QLibrary::LoadHints lh = QLibrary::PreventUnloadHint;
|
QLibrary::LoadHints lh = defaultLoadHints;
|
||||||
if (d) {
|
if (d) {
|
||||||
lh = d->loadHints();
|
lh = d->loadHints();
|
||||||
d->release();
|
d->release();
|
||||||
@ -394,7 +396,12 @@ void QPluginLoader::setLoadHints(QLibrary::LoadHints loadHints)
|
|||||||
|
|
||||||
QLibrary::LoadHints QPluginLoader::loadHints() const
|
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)
|
#endif // QT_CONFIG(library)
|
||||||
|
@ -245,10 +245,19 @@ void tst_QPluginLoader::loadHints()
|
|||||||
QSKIP("This test requires Qt to create shared libraries.");
|
QSKIP("This test requires Qt to create shared libraries.");
|
||||||
#endif
|
#endif
|
||||||
QPluginLoader loader;
|
QPluginLoader loader;
|
||||||
QCOMPARE(loader.loadHints(), QLibrary::LoadHints{}); //Do not crash
|
QCOMPARE(loader.loadHints(), QLibrary::PreventUnloadHint); //Do not crash
|
||||||
loader.setLoadHints(QLibrary::ResolveAllSymbolsHint);
|
loader.setLoadHints(QLibrary::ResolveAllSymbolsHint);
|
||||||
|
QCOMPARE(loader.loadHints(), QLibrary::ResolveAllSymbolsHint);
|
||||||
loader.setFileName( sys_qualifiedLibraryName("theplugin")); //a plugin
|
loader.setFileName( sys_qualifiedLibraryName("theplugin")); //a plugin
|
||||||
QCOMPARE(loader.loadHints(), QLibrary::ResolveAllSymbolsHint);
|
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()
|
void tst_QPluginLoader::deleteinstanceOnUnload()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user