Browse Source

Fixed memory management issues in PluginFramework.

- ctkPlugin pointers are now returned as QSharedPointer objects
- Internally allocated memory is now freed
- PluginFramework is properly uninitialized on destruction
Sascha Zelzer 14 years ago
parent
commit
beb04d85d7
25 changed files with 104 additions and 80 deletions
  1. 4 4
      Applications/ctkExampleHost/ctkExampleHostMain.cpp
  2. 3 3
      Applications/ctkExampleHostedApp/ctkExampleHostedAppMain.cpp
  3. 1 1
      Applications/ctkPluginBrowser/ctkPluginBrowser.cpp
  4. 2 2
      Applications/ctkPluginBrowser/ctkPluginBrowserMain.cpp
  5. 3 3
      Applications/ctkPluginGenerator/ctkPluginGeneratorMain.cpp
  6. 2 2
      Libs/PluginFramework/Testing/Cpp/ctkPluginFrameworkTestMain.cpp
  7. 1 1
      Libs/PluginFramework/Testing/Cpp/ctkPluginFrameworkTestUtil.h
  8. 7 7
      Libs/PluginFramework/Testing/FrameworkTest/ctkPluginFrameworkTestSuite.cpp
  9. 3 3
      Libs/PluginFramework/Testing/FrameworkTest/ctkPluginFrameworkTestSuite_p.h
  10. 1 2
      Libs/PluginFramework/Testing/TestPlugins/pluginA_test/ctkTestPluginAActivator.cpp
  11. 4 3
      Libs/PluginFramework/Testing/TestPlugins/pluginA_test/ctkTestPluginAActivator_p.h
  12. 2 2
      Libs/PluginFramework/ctkPlugin.cpp
  13. 1 1
      Libs/PluginFramework/ctkPluginContext.cpp
  14. 2 1
      Libs/PluginFramework/ctkPluginContext.h
  15. 18 6
      Libs/PluginFramework/ctkPluginFrameworkContext.cpp
  16. 5 1
      Libs/PluginFramework/ctkPluginFrameworkContext_p.h
  17. 3 2
      Libs/PluginFramework/ctkPluginFrameworkFactory.cpp
  18. 2 1
      Libs/PluginFramework/ctkPluginFrameworkFactory.h
  19. 1 1
      Libs/PluginFramework/ctkPluginFrameworkPrivate.cpp
  20. 6 6
      Libs/PluginFramework/ctkPluginPrivate.cpp
  21. 1 1
      Libs/PluginFramework/ctkPluginPrivate_p.h
  22. 1 2
      Libs/PluginFramework/ctkPluginStorage.cpp
  23. 27 21
      Libs/PluginFramework/ctkPlugins.cpp
  24. 3 3
      Libs/PluginFramework/ctkPlugins_p.h
  25. 1 1
      Libs/PluginFramework/ctkServiceRegistration.h

+ 4 - 4
Applications/ctkExampleHost/ctkExampleHostMain.cpp

@@ -46,7 +46,7 @@ int main(int argv, char** argc)
   qApp->setApplicationName("ctkExampleHost");
 
   ctkPluginFrameworkFactory fwFactory;
-  ctkPluginFramework* framework = fwFactory.getFramework();
+  QSharedPointer<ctkPluginFramework> framework = fwFactory.getFramework();
 
   try {
     framework->init();
@@ -73,7 +73,7 @@ int main(int argv, char** argc)
   pluginsToInstall << "org_commontk_dah_core" << "org_commontk_dah_host"
                    << "org_commontk_dah_examplehost";
 
-  QList<ctkPlugin*> installedPlugins;
+  QList<QSharedPointer<ctkPlugin> > installedPlugins;
   while(dirIter.hasNext())
   {
     try
@@ -83,7 +83,7 @@ int main(int argv, char** argc)
       {
         if (fileLocation.contains(pluginToInstall))
         {
-          ctkPlugin* plugin = framework->getPluginContext()->installPlugin(QUrl::fromLocalFile(fileLocation));
+          QSharedPointer<ctkPlugin> plugin = framework->getPluginContext()->installPlugin(QUrl::fromLocalFile(fileLocation));
           installedPlugins << plugin;
           break;
         }
@@ -97,7 +97,7 @@ int main(int argv, char** argc)
 
   framework->start();
 
-  foreach(ctkPlugin* plugin, installedPlugins)
+  foreach(QSharedPointer<ctkPlugin> plugin, installedPlugins)
   {
     plugin->start();
   }

+ 3 - 3
Applications/ctkExampleHostedApp/ctkExampleHostedAppMain.cpp

@@ -82,7 +82,7 @@ int main(int argv, char** argc)
   fwProps.insert("dah.hostURL", hostURL);
   fwProps.insert("dah.appURL", appURL);
   ctkPluginFrameworkFactory fwFactory(fwProps);
-  ctkPluginFramework* framework = fwFactory.getFramework();
+  QSharedPointer<ctkPluginFramework> framework = fwFactory.getFramework();
 
   try {
     framework->init();
@@ -115,7 +115,7 @@ int main(int argv, char** argc)
 
   // try to find the plugin and install all plugins available in 
   // pluginPath containing the string "org_commontk_dah" (but do not start them)
-  ctkPlugin* appPlugin = 0;
+  QSharedPointer<ctkPlugin> appPlugin;
   QStringList libFilter;
   libFilter << "*.dll" << "*.so" << "*.dylib";
   QDirIterator dirIter(pluginPath, libFilter, QDir::Files);
@@ -126,7 +126,7 @@ int main(int argv, char** argc)
       QString fileLocation = dirIter.next();
       if (fileLocation.contains("org_commontk_dah"))
       {
-        ctkPlugin* plugin = framework->getPluginContext()->installPlugin(QUrl::fromLocalFile(fileLocation));
+        QSharedPointer<ctkPlugin> plugin = framework->getPluginContext()->installPlugin(QUrl::fromLocalFile(fileLocation));
         if (fileLocation.contains(pluginName))
         {
           appPlugin = plugin;

+ 1 - 1
Applications/ctkPluginBrowser/ctkPluginBrowser.cpp

@@ -82,7 +82,7 @@ ctkPluginBrowser::ctkPluginBrowser(ctkPluginFramework* framework)
   {
     try
     {
-      ctkPlugin* plugin = framework->getPluginContext()->installPlugin(QUrl::fromLocalFile(dirIter.next()).toString());
+      framework->getPluginContext()->installPlugin(QUrl::fromLocalFile(dirIter.next()).toString());
       //plugin->start(ctkPlugin::START_ACTIVATION_POLICY);
     }
     catch (const ctkPluginException& e)

+ 2 - 2
Applications/ctkPluginBrowser/ctkPluginBrowserMain.cpp

@@ -37,7 +37,7 @@ int main(int argv, char** argc)
   app.setApplicationName("ctkPluginBrowser");
 
   ctkPluginFrameworkFactory fwFactory;
-  ctkPluginFramework* framework = fwFactory.getFramework();
+  QSharedPointer<ctkPluginFramework> framework = fwFactory.getFramework();
 
   try {
     framework->init();
@@ -48,7 +48,7 @@ int main(int argv, char** argc)
     exit(1);
   }
 
-  ctkPluginBrowser browser(framework);
+  ctkPluginBrowser browser(framework.data());
   browser.show();
 
   return app.exec();

+ 3 - 3
Applications/ctkPluginGenerator/ctkPluginGeneratorMain.cpp

@@ -59,7 +59,7 @@ int main(int argv, char** argc)
   }
 
   ctkPluginFrameworkFactory fwFactory;
-  ctkPluginFramework* framework = fwFactory.getFramework();
+  QSharedPointer<ctkPluginFramework> framework = fwFactory.getFramework();
 
   try {
     framework->init();
@@ -88,7 +88,7 @@ int main(int argv, char** argc)
       QString fileLocation = dirIter.next();
       if (fileLocation.contains("org_commontk_plugingenerator"))
       {
-        ctkPlugin* plugin = framework->getPluginContext()->installPlugin(QUrl::fromLocalFile(fileLocation));
+        QSharedPointer<ctkPlugin> plugin = framework->getPluginContext()->installPlugin(QUrl::fromLocalFile(fileLocation));
         plugin->start(ctkPlugin::START_TRANSIENT);
       }
     }
@@ -100,7 +100,7 @@ int main(int argv, char** argc)
 
   framework->start();
 
-  ctkPluginGenerator generator(framework);
+  ctkPluginGenerator generator(framework.data());
   generator.show();
 
   return app.exec();

+ 2 - 2
Libs/PluginFramework/Testing/Cpp/ctkPluginFrameworkTestMain.cpp

@@ -81,12 +81,12 @@ int main(int argc, char** argv)
   fwProps.insert(ctkPluginConstants::FRAMEWORK_STORAGE_CLEAN, ctkPluginConstants::FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT);
   fwProps.insert("pluginfw.testDir", pluginDir);
   ctkPluginFrameworkFactory fwFactory(fwProps);
-  ctkPluginFramework* framework = fwFactory.getFramework();
+  QSharedPointer<ctkPluginFramework> framework = fwFactory.getFramework();
   framework->start();
 
   ctkPluginContext* context = framework->getPluginContext();
 
-  ctkPlugin* fwTest = 0;
+  QSharedPointer<ctkPlugin> fwTest;
   QStringList libFilter;
   libFilter << "*.dll" << "*.so" << "*.dylib";
   QDirIterator dirIter(pluginDir, libFilter, QDir::Files);

+ 1 - 1
Libs/PluginFramework/Testing/Cpp/ctkPluginFrameworkTestUtil.h

@@ -35,7 +35,7 @@ class ctkPluginFrameworkTestUtil
 {
 public:
 
-  static ctkPlugin* installPlugin(ctkPluginContext* pc, const QString& plugin)
+  static QSharedPointer<ctkPlugin> installPlugin(ctkPluginContext* pc, const QString& plugin)
   { 
     qDebug() << "installPlugin(" << plugin << ")";
     QFileInfo pluginInfo(plugin);

+ 7 - 7
Libs/PluginFramework/Testing/FrameworkTest/ctkPluginFrameworkTestSuite.cpp

@@ -147,7 +147,7 @@ void ctkPluginFrameworkTestSuite::frame005a()
 // also check that the expected events in the framework occur
 void ctkPluginFrameworkTestSuite::frame020a()
 {
-  pA = 0;
+  pA.clear();
 
   try
   {
@@ -222,8 +222,8 @@ void ctkPluginFrameworkTestSuite::frame025b()
 
     // check the listeners for events
     QList<ctkPluginEvent> pEvts;
-    pEvts.push_back(ctkPluginEvent(ctkPluginEvent::RESOLVED, pA));
-    pEvts.push_back(ctkPluginEvent(ctkPluginEvent::STARTED, pA));
+    pEvts.push_back(ctkPluginEvent(ctkPluginEvent::RESOLVED, pA.data()));
+    pEvts.push_back(ctkPluginEvent(ctkPluginEvent::STARTED, pA.data()));
 
     QList<ctkServiceEvent> seEvts;
     seEvts.push_back(ctkServiceEvent(ctkServiceEvent::REGISTERED, sr1));
@@ -232,7 +232,7 @@ void ctkPluginFrameworkTestSuite::frame025b()
              "Unexpected events");
 
     QList<ctkPluginEvent> syncPEvts;
-    syncPEvts.push_back(ctkPluginEvent(ctkPluginEvent::STARTING, pA));
+    syncPEvts.push_back(ctkPluginEvent(ctkPluginEvent::STARTING, pA.data()));
 
     QVERIFY2(checkSyncListenerEvents(syncPEvts), "Unexpected events");
   }
@@ -310,14 +310,14 @@ bool ctkPluginFrameworkTestSuite::checkListenerEvents(
     bool fwexp, ctkPluginFrameworkEvent::Type fwtype,
     bool pexp, ctkPluginEvent::Type ptype,
     bool sexp, ctkServiceEvent::Type stype,
-    ctkPlugin* pluginX, ctkServiceReference* servX)
+    QSharedPointer<ctkPlugin> pluginX, ctkServiceReference* servX)
 {
   QList<ctkPluginFrameworkEvent> fwEvts;
   QList<ctkPluginEvent> pEvts;
   QList<ctkServiceEvent> seEvts;
 
-  if (fwexp) fwEvts << ctkPluginFrameworkEvent(fwtype, pluginX);
-  if (pexp) pEvts << ctkPluginEvent(ptype, pluginX);
+  if (fwexp) fwEvts << ctkPluginFrameworkEvent(fwtype, pluginX.data());
+  if (pexp) pEvts << ctkPluginEvent(ptype, pluginX.data());
   if (sexp) seEvts << ctkServiceEvent(stype, *servX);
 
   return checkListenerEvents(fwEvts, pEvts, seEvts);

+ 3 - 3
Libs/PluginFramework/Testing/FrameworkTest/ctkPluginFrameworkTestSuite_p.h

@@ -71,7 +71,7 @@ private:
       bool fwexp, ctkPluginFrameworkEvent::Type fwtype,
       bool pexp, ctkPluginEvent::Type ptype,
       bool sexp, ctkServiceEvent::Type stype,
-      ctkPlugin* pluginX, ctkServiceReference* servX);
+      QSharedPointer<ctkPlugin> pluginX, ctkServiceReference* servX);
 
   // Check that the expected events have reached the listeners and
   // reset the events
@@ -100,9 +100,9 @@ private:
   int eventDelay;
 
   ctkPluginContext* pc;
-  ctkPlugin* p;
+  QSharedPointer<ctkPlugin> p;
 
-  ctkPlugin* pA;
+  QSharedPointer<ctkPlugin> pA;
 
 };
 

+ 1 - 2
Libs/PluginFramework/Testing/TestPlugins/pluginA_test/ctkTestPluginAActivator.cpp

@@ -29,13 +29,12 @@
 
 void ctkTestPluginAActivator::start(ctkPluginContext* context)
 {
-  s = new ctkTestPluginA(context);
+  s.reset(new ctkTestPluginA(context));
 }
 
 void ctkTestPluginAActivator::stop(ctkPluginContext* context)
 {
   Q_UNUSED(context)
-  delete s;
 }
 
 Q_EXPORT_PLUGIN2(pluginA_test, ctkTestPluginAActivator)

+ 4 - 3
Libs/PluginFramework/Testing/TestPlugins/pluginA_test/ctkTestPluginAActivator_p.h

@@ -22,9 +22,10 @@
 #ifndef CTKTESTPLUGINAACTIVATOR_P_H
 #define CTKTESTPLUGINAACTIVATOR_P_H
 
-#include <ctkPluginActivator.h>
+#include <QScopedPointer>
 
-class ctkTestPluginAService;
+#include <ctkPluginActivator.h>
+#include <ctkTestPluginAService.h>
 
 class ctkTestPluginAActivator : public QObject,
                                 public ctkPluginActivator
@@ -39,7 +40,7 @@ public:
 
 private:
 
-  ctkTestPluginAService* s;
+  QScopedPointer<ctkTestPluginAService> s;
 
 };
 

+ 2 - 2
Libs/PluginFramework/ctkPlugin.cpp

@@ -89,7 +89,7 @@ void ctkPlugin::start(const StartOptions& options)
   {
     if (STARTING == d->state) return;
     d->state = STARTING;
-    d->pluginContext = new ctkPluginContext(this->d_func());
+    d->pluginContext.reset(new ctkPluginContext(this->d_func()));
     ctkPluginEvent pluginEvent(ctkPluginEvent::LAZY_ACTIVATION, this);
     d->fwCtx->listeners.emitPluginChanged(pluginEvent);
   }
@@ -179,7 +179,7 @@ ctkPluginContext* ctkPlugin::getPluginContext() const
 {
   //TODO security checks
   Q_D(const ctkPlugin);
-  return d->pluginContext;
+  return d->pluginContext.data();
 }
 
 long ctkPlugin::getPluginId() const

+ 1 - 1
Libs/PluginFramework/ctkPluginContext.cpp

@@ -86,7 +86,7 @@ QList<ctkPlugin*> ctkPluginContext::getPlugins() const
   return d->plugin->fwCtx->plugins->getPlugins();
 }
 
-ctkPlugin* ctkPluginContext::installPlugin(const QUrl& location, QIODevice* in)
+QSharedPointer<ctkPlugin> ctkPluginContext::installPlugin(const QUrl& location, QIODevice* in)
 {
   Q_D(ctkPluginContext);
   d->isPluginContextValid();

+ 2 - 1
Libs/PluginFramework/ctkPluginContext.h

@@ -26,6 +26,7 @@
 #include <QString>
 #include <QVariant>
 #include <QUrl>
+#include <QSharedPointer>
 
 #include "ctkPluginFramework_global.h"
 
@@ -448,7 +449,7 @@
      *         installation failed.
      * @throws std::logic_error If this ctkPluginContext is no longer valid.
      */
-    ctkPlugin* installPlugin(const QUrl& location, QIODevice* in = 0);
+    QSharedPointer<ctkPlugin> installPlugin(const QUrl& location, QIODevice* in = 0);
 
     /**
      * Connects the specified <code>slot</code> to the context

+ 18 - 6
Libs/PluginFramework/ctkPluginFrameworkContext.cpp

@@ -34,8 +34,8 @@ int ctkPluginFrameworkContext::globalId = 1;
 
 ctkPluginFrameworkContext::ctkPluginFrameworkContext(
     const ctkProperties& initProps)
-      : plugins(0), services(0), systemPlugin(this),
-      storage(0), firstInit(true), props(initProps)
+      : plugins(0), services(0), systemPlugin(new ctkPluginFramework(this)),
+      storage(0), firstInit(true), props(initProps), initialized(false)
 {
   {
     QMutexLocker lock(&globalFwLock);
@@ -45,6 +45,14 @@ ctkPluginFrameworkContext::ctkPluginFrameworkContext(
   log() << "created";
 }
 
+ctkPluginFrameworkContext::~ctkPluginFrameworkContext()
+{
+  if (initialized)
+  {
+    this->uninit();
+  }
+}
+
 void ctkPluginFrameworkContext::init()
 {
   log() << "initializing";
@@ -56,7 +64,7 @@ void ctkPluginFrameworkContext::init()
     firstInit = false;
   }
 
-  ctkPluginFrameworkPrivate* const systemPluginPrivate = systemPlugin.d_func();
+  ctkPluginFrameworkPrivate* const systemPluginPrivate = systemPlugin->d_func();
   systemPluginPrivate->initSystemPlugin();
 
   storage = new ctkPluginStorage(this);
@@ -66,6 +74,7 @@ void ctkPluginFrameworkContext::init()
   plugins->load();
 
   log() << "inited";
+  initialized = true;
 
   log() << "Installed plugins:";
   // Use the ordering in the plugin storage to get a sorted list of plugins.
@@ -81,21 +90,24 @@ void ctkPluginFrameworkContext::init()
 
 void ctkPluginFrameworkContext::uninit()
 {
+  if (!initialized) return;
+
   log() << "uninit";
 
-  ctkPluginFrameworkPrivate* const systemPluginPrivate = systemPlugin.d_func();
+  ctkPluginFrameworkPrivate* const systemPluginPrivate = systemPlugin->d_func();
   systemPluginPrivate->uninitSystemPlugin();
 
   plugins->clear();
   delete plugins;
   plugins = 0;
 
-  storage->close();
-  delete storage;
+  delete storage; // calls storage->close()
   storage = 0;
 
   delete services;
   services = 0;
+
+  initialized = false;
 }
 
 int ctkPluginFrameworkContext::getId() const

+ 5 - 1
Libs/PluginFramework/ctkPluginFrameworkContext_p.h

@@ -58,7 +58,7 @@ public:
   /**
    * System plugin
    */
-  ctkPluginFramework systemPlugin;
+  QSharedPointer<ctkPluginFramework> systemPlugin;
 
   /**
    * ctkPlugin storage
@@ -93,6 +93,8 @@ public:
    */
   ctkPluginFrameworkContext(const ctkProperties& initProps);
 
+  ~ctkPluginFrameworkContext();
+
 
   /**
    * Initialize the framework
@@ -142,6 +144,8 @@ private:
 
   QSet<ctkPluginPrivate*> tempResolved;
 
+  bool initialized;
+
   /**
    * Delete framework directory if it exists.
    *

+ 3 - 2
Libs/PluginFramework/ctkPluginFrameworkFactory.cpp

@@ -32,11 +32,12 @@
 
   ctkPluginFrameworkFactory::~ctkPluginFrameworkFactory()
   {
+    fwCtx->uninit();
     delete fwCtx;
   }
 
-  ctkPluginFramework* ctkPluginFrameworkFactory::getFramework()
+  QSharedPointer<ctkPluginFramework> ctkPluginFrameworkFactory::getFramework()
   {
-    return &(fwCtx->systemPlugin);
+    return fwCtx->systemPlugin;
 
 }

+ 2 - 1
Libs/PluginFramework/ctkPluginFrameworkFactory.h

@@ -25,6 +25,7 @@
 #include <QHash>
 #include <QString>
 #include <QVariant>
+#include <QSharedPointer>
 
 #include "ctkPluginFrameworkExport.h"
 
@@ -67,7 +68,7 @@
      * @return A new, configured ctkPluginFramework instance. The plugin
      *         framework instance must be in the ctkPlugin::INSTALLED state.
      */
-    ctkPluginFramework* getFramework();
+    QSharedPointer<ctkPluginFramework> getFramework();
 
   private:
 

+ 1 - 1
Libs/PluginFramework/ctkPluginFrameworkPrivate.cpp

@@ -46,7 +46,7 @@ void ctkPluginFrameworkPrivate::init()
 
 void ctkPluginFrameworkPrivate::initSystemPlugin()
 {
-  this->pluginContext = new ctkPluginContext(this);
+  this->pluginContext.reset(new ctkPluginContext(this));
 }
 
 void ctkPluginFrameworkPrivate::uninitSystemPlugin()

+ 6 - 6
Libs/PluginFramework/ctkPluginPrivate.cpp

@@ -81,7 +81,7 @@ ctkPluginPrivate::ctkPluginPrivate(ctkPlugin& qq,
 ctkPluginPrivate::~ctkPluginPrivate()
 {
   qDeleteAll(require);
-  delete pluginContext;
+  delete archive;
 }
 
 ctkPlugin::State ctkPluginPrivate::getUpdatedState()
@@ -191,7 +191,7 @@ void ctkPluginPrivate::finalizeActivation()
     //7:
     if (!pluginContext)
     {
-      pluginContext = new ctkPluginContext(this);
+      pluginContext.reset(new ctkPluginContext(this));
     }
     try
     {
@@ -207,7 +207,7 @@ void ctkPluginPrivate::finalizeActivation()
       // NYI, call outside lock
       fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::STOPPING, this->q_func()));
       removePluginResources();
-      delete pluginContext;
+      pluginContext.reset();
 
       state = ctkPlugin::RESOLVED;
       // NYI, call outside lock
@@ -246,7 +246,7 @@ void ctkPluginPrivate::stop0(bool wasStarted)
     {
       try
       {
-        pluginActivator->stop(pluginContext);
+        pluginActivator->stop(pluginContext.data());
       }
       catch (const std::exception& e)
       {
@@ -267,7 +267,7 @@ void ctkPluginPrivate::stop0(bool wasStarted)
     if (pluginContext)
     {
       pluginContext->d_func()->invalidate();
-      pluginContext = 0;
+      //pluginContext = 0;
     }
     //8-10:
     removePluginResources();
@@ -337,7 +337,7 @@ void ctkPluginPrivate::start0()
                                ctkPluginException::ACTIVATOR_ERROR);
     }
 
-    pluginActivator->start(pluginContext);
+    pluginActivator->start(pluginContext.data());
 
     if (ctkPlugin::UNINSTALLED == state)
     {

+ 1 - 1
Libs/PluginFramework/ctkPluginPrivate_p.h

@@ -138,7 +138,7 @@ public:
   /**
    * ctkPluginContext for the plugin
    */
-  ctkPluginContext* pluginContext;
+  QScopedPointer<ctkPluginContext> pluginContext;
 
   /**
    * ctkPluginActivator for the plugin

+ 1 - 2
Libs/PluginFramework/ctkPluginStorage.cpp

@@ -102,7 +102,7 @@ ctkPluginStorage::~ctkPluginStorage()
 void ctkPluginStorage::close()
 {
   pluginDatabase.close();
-  qDeleteAll(archives);
+  //qDeleteAll(archives);
 }
 
 bool ctkPluginStorage::removeArchive(ctkPluginArchive* pa)
@@ -114,7 +114,6 @@ bool ctkPluginStorage::removeArchive(ctkPluginArchive* pa)
   {
     pluginDatabase.removeArchive(pa);
     removed = archives.removeAll(pa);
-    delete pa;
   }
   catch (const ctkPluginDatabaseException& exc)
   {

+ 27 - 21
Libs/PluginFramework/ctkPlugins.cpp

@@ -36,7 +36,7 @@
 ctkPlugins::ctkPlugins(ctkPluginFrameworkContext* fw)
 {
   fwCtx = fw;
-  plugins.insert(fw->systemPlugin.getLocation(), &fw->systemPlugin);
+  plugins.insert(fw->systemPlugin->getLocation(), fw->systemPlugin);
 }
 
 void ctkPlugins::clear()
@@ -46,7 +46,7 @@ void ctkPlugins::clear()
   fwCtx = 0;
 }
 
-ctkPlugin* ctkPlugins::install(const QUrl& location, QIODevice* in)
+QSharedPointer<ctkPlugin> ctkPlugins::install(const QUrl& location, QIODevice* in)
 {
   if (!fwCtx)
   { // This ctkPlugins instance has been closed!
@@ -56,7 +56,7 @@ ctkPlugin* ctkPlugins::install(const QUrl& location, QIODevice* in)
   {
     QWriteLocker lock(&pluginsLock);
 
-    QHash<QString, ctkPlugin*>::const_iterator it = plugins.find(location.toString());
+    QHash<QString, QSharedPointer<ctkPlugin> >::const_iterator it = plugins.find(location.toString());
     if (it != plugins.end())
     {
       return it.value();
@@ -111,10 +111,10 @@ ctkPlugin* ctkPlugins::install(const QUrl& location, QIODevice* in)
 
       pa = fwCtx->storage->insertPlugin(location, localPluginPath);
 
-      ctkPlugin* res = new ctkPlugin(fwCtx, pa);
+      QSharedPointer<ctkPlugin> res(new ctkPlugin(fwCtx, pa));
       plugins.insert(location.toString(), res);
 
-      fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::INSTALLED, res));
+      fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::INSTALLED, res.data()));
 
       return res;
     }
@@ -140,7 +140,7 @@ ctkPlugin* ctkPlugins::install(const QUrl& location, QIODevice* in)
 void ctkPlugins::remove(const QUrl& location)
 {
   QWriteLocker lock(&pluginsLock);
-  delete plugins.take(location.toString());
+  plugins.remove(location.toString());
 }
 
 ctkPlugin* ctkPlugins::getPlugin(int id) const
@@ -153,13 +153,13 @@ ctkPlugin* ctkPlugins::getPlugin(int id) const
   {
     QReadLocker lock(&pluginsLock);
 
-    QHashIterator<QString, ctkPlugin*> it(plugins);
+    QHashIterator<QString, QSharedPointer<ctkPlugin> > it(plugins);
     while (it.hasNext())
     {
-      ctkPlugin* plugin = it.next().value();
+      QSharedPointer<ctkPlugin> plugin = it.next().value();
       if (plugin->getPluginId() == id)
       {
-        return plugin;
+        return plugin.data();
       }
     }
   }
@@ -174,8 +174,8 @@ ctkPlugin* ctkPlugins::getPlugin(const QString& location) const
   }
 
   QReadLocker lock(&pluginsLock);
-  QHash<QString, ctkPlugin*>::const_iterator it = plugins.find(location);
-  if (it != plugins.end()) return it.value();
+  QHash<QString, QSharedPointer<ctkPlugin> >::const_iterator it = plugins.find(location);
+  if (it != plugins.end()) return it.value().data();
   return 0;
 }
 
@@ -189,13 +189,13 @@ ctkPlugin* ctkPlugins::getPlugin(const QString& name, const ctkVersion& version)
   {
     QReadLocker lock(&pluginsLock);
 
-    QHashIterator<QString, ctkPlugin*> it(plugins);
+    QHashIterator<QString, QSharedPointer<ctkPlugin> > it(plugins);
     while (it.hasNext())
     {
-      ctkPlugin* plugin = it.next().value();
+      QSharedPointer<ctkPlugin> plugin = it.next().value();
       if ((name == plugin->getSymbolicName()) && (version == plugin->getVersion()))
       {
-        return plugin;
+        return plugin.data();
       }
     }
   }
@@ -211,7 +211,13 @@ QList<ctkPlugin*> ctkPlugins::getPlugins() const
 
   {
     QReadLocker lock(&pluginsLock);
-    return plugins.values();
+    QList<ctkPlugin*> res;
+    QHashIterator<QString, QSharedPointer<ctkPlugin> > it(plugins);
+    while (it.hasNext())
+    {
+      res.push_back(it.next().value().data());
+    }
+    return res;
   }
 }
 
@@ -221,10 +227,10 @@ QList<ctkPlugin*> ctkPlugins::getPlugins(const QString& name) const
 
   {
     QReadLocker lock(&pluginsLock);
-    QHashIterator<QString, ctkPlugin*> it(plugins);
+    QHashIterator<QString, QSharedPointer<ctkPlugin> > it(plugins);
     while (it.hasNext())
     {
-      ctkPlugin* plugin = it.next().value();
+      ctkPlugin* plugin = it.next().value().data();
       if (name == plugin->getSymbolicName())
       {
         res.push_back(plugin);
@@ -275,13 +281,13 @@ QList<ctkPlugin*> ctkPlugins::getActivePlugins() const
   QList<ctkPlugin*> slist;
   {
     QReadLocker lock(&pluginsLock);
-    QHashIterator<QString, ctkPlugin*> it(plugins);
+    QHashIterator<QString, QSharedPointer<ctkPlugin> > it(plugins);
     while (it.hasNext())
     {
-      ctkPlugin* plugin = it.next().value();
+      QSharedPointer<ctkPlugin> plugin = it.next().value();
       ctkPlugin::State s = plugin->getState();
       if (s == ctkPlugin::ACTIVE || s == ctkPlugin::STARTING) {
-        slist.push_back(plugin);
+        slist.push_back(plugin.data());
       }
     }
   }
@@ -300,7 +306,7 @@ void ctkPlugins::load()
       ctkPluginArchive* pa = it.next();
       try
       {
-        ctkPlugin* plugin = new ctkPlugin(fwCtx, pa);
+        QSharedPointer<ctkPlugin> plugin(new ctkPlugin(fwCtx, pa));
         plugins.insert(pa->getPluginLocation().toString(), plugin);
       }
       catch (const std::exception& e)

+ 3 - 3
Libs/PluginFramework/ctkPlugins_p.h

@@ -25,7 +25,7 @@
 #include <QUrl>
 #include <QHash>
 #include <QReadWriteLock>
-
+#include <QSharedPointer>
 
 
   // CTK class forward declarations
@@ -47,7 +47,7 @@
      * Table of all installed plugins in this framework.
      * Key is the plugin location.
      */
-    QHash<QString, ctkPlugin*> plugins;
+    QHash<QString, QSharedPointer<ctkPlugin> > plugins;
 
     /**
      * Link to framework object.
@@ -76,7 +76,7 @@
      *
      * @param location The location to be installed
      */
-    ctkPlugin* install(const QUrl& location, QIODevice* in);
+    QSharedPointer<ctkPlugin> install(const QUrl& location, QIODevice* in);
 
 
     /**

+ 1 - 1
Libs/PluginFramework/ctkServiceRegistration.h

@@ -137,7 +137,7 @@
 
     ctkServiceRegistration(ctkServiceRegistrationPrivate& dd);
 
-    ctkServiceRegistrationPrivate * const d_ptr;
+    const QScopedPointer<ctkServiceRegistrationPrivate> d_ptr;
 
   };