Pārlūkot izejas kodu

Fixed dead-lock issue during plug-in install.

Sascha Zelzer 14 gadi atpakaļ
vecāks
revīzija
6d23c22542

+ 7 - 8
Libs/PluginFramework/ctkPlugins.cpp

@@ -55,8 +55,9 @@ QSharedPointer<ctkPlugin> ctkPlugins::install(const QUrl& location, QIODevice* i
     throw std::logic_error("ctkPlugins::install(location, inputStream) called on closed plugins object.");
   }
 
+  QSharedPointer<ctkPlugin> res;
   {
-    QWriteLocker lock(&pluginsLock);
+    QMutexLocker lock(&objectLock);
 
     QHash<QString, QSharedPointer<ctkPlugin> >::const_iterator it = plugins.find(location.toString());
     if (it != plugins.end())
@@ -113,13 +114,9 @@ QSharedPointer<ctkPlugin> ctkPlugins::install(const QUrl& location, QIODevice* i
 
       pa = fwCtx->storage->insertPlugin(location, localPluginPath);
 
-      QSharedPointer<ctkPlugin> res(new ctkPlugin());
+      res = QSharedPointer<ctkPlugin>(new ctkPlugin());
       res->init(res, fwCtx, pa);
       plugins.insert(location.toString(), res);
-
-      fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::INSTALLED, res));
-
-      return res;
     }
     catch (const std::exception& e)
     {
@@ -138,6 +135,8 @@ QSharedPointer<ctkPlugin> ctkPlugins::install(const QUrl& location, QIODevice* i
     }
   }
 
+  fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::INSTALLED, res));
+  return res;
 }
 
 //----------------------------------------------------------------------------
@@ -306,7 +305,7 @@ void ctkPlugins::load()
   QListIterator<ctkPluginArchive*> it(pas);
 
   {
-    QWriteLocker lock(&pluginsLock);
+    QMutexLocker lock(&objectLock);
     while (it.hasNext())
     {
       ctkPluginArchive* pa = it.next();
@@ -325,7 +324,7 @@ void ctkPlugins::load()
             << pa->getPluginId()
             << " ("  << qPrintable(pa->getPluginLocation().toString())  << ")"
             << " uninstalled it!\n";
-        std::cerr << e.what();
+        std::cerr << e.what() << std::endl;
       }
     }
   }

+ 5 - 0
Libs/PluginFramework/ctkPlugins_p.h

@@ -25,6 +25,7 @@
 #include <QUrl>
 #include <QHash>
 #include <QReadWriteLock>
+#include <QMutex>
 #include <QSharedPointer>
 
 
@@ -61,6 +62,10 @@ private:
    */
   mutable QReadWriteLock pluginsLock;
 
+  /**
+   * Lock for protecting this object.
+   */
+  QMutex objectLock;
 
 public: