From 47c48ea87ae836b1c22255744ec2ef8aacdb61af Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 30 Jul 2012 12:30:58 +0200 Subject: Fix reloading of plugins Unloading and reloading a plugin didn't work correctly, because we didn't reset instance to 0 on unload. Task-number: QTBUG-26098 Change-Id: Ic3e4497f359b1ca455be949dce9cafa9d67d8039 Reviewed-by: Thiago Macieira --- src/corelib/plugin/qlibrary.cpp | 1 + .../plugin/qpluginloader/tst_qpluginloader.cpp | 24 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) 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(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" -- cgit v1.2.3