summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/plugin/qlibrary.cpp1
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp24
2 files changed, 25 insertions, 0 deletions
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
index 3815082989..2217140cbf 100644
--- a/src/corelib/plugin/qlibrary.cpp
+++ b/src/corelib/plugin/qlibrary.cpp
@@ -429,6 +429,7 @@ bool QLibraryPrivate::unload()
libraryRefCount.deref();
}
pHnd = 0;
+ instance = 0;
}
}
diff --git a/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp b/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp
index b79479ace8..58081cc6e3 100644
--- a/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp
+++ b/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp
@@ -109,6 +109,7 @@ private slots:
void loadDebugObj();
void loadCorruptElf();
void loadGarbage();
+ void reloadPlugin();
};
void tst_QPluginLoader::errorString()
@@ -291,5 +292,28 @@ void tst_QPluginLoader::loadGarbage()
#endif
}
+void tst_QPluginLoader::reloadPlugin()
+{
+ QPluginLoader loader;
+ loader.setFileName( sys_qualifiedLibraryName("theplugin")); //a plugin
+ loader.load(); // not recommended, instance() should do the job.
+ PluginInterface *instance = qobject_cast<PluginInterface*>(loader.instance());
+ QVERIFY(instance);
+ QCOMPARE(instance->pluginName(), QLatin1String("Plugin ok"));
+
+ QSignalSpy spy(loader.instance(), SIGNAL(destroyed()));
+ QVERIFY(spy.isValid());
+ QVERIFY(loader.unload()); // refcount reached 0, did really unload
+ QCOMPARE(spy.count(), 1);
+
+ // reload plugin
+ QVERIFY(loader.load());
+ QVERIFY(loader.isLoaded());
+
+ PluginInterface *instance2 = qobject_cast<PluginInterface*>(loader.instance());
+ QVERIFY(instance2);
+ QCOMPARE(instance2->pluginName(), QLatin1String("Plugin ok"));
+}
+
QTEST_MAIN(tst_QPluginLoader)
#include "tst_qpluginloader.moc"