diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp index 38150829890..2217140cbf4 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 b79479ace8b..58081cc6e3a 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(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(loader.instance()); + QVERIFY(instance2); + QCOMPARE(instance2->pluginName(), QLatin1String("Plugin ok")); +} + QTEST_MAIN(tst_QPluginLoader) #include "tst_qpluginloader.moc"