Quellcode durchsuchen

During resolving a plug-in, set the state of resolved dependencies.

When resolving a plug-in, its dependencies are resolved too. We now
immediately set their state to RESOLVED and send the appropriate event.
This seems okay - the OSGi specs state that the framework may try to
resolve plug-ins at any time. This change ensures that resolve events
are fired according to plug-in dependency order. Should fix #127.
Sascha Zelzer vor 13 Jahren
Ursprung
Commit
6f266fcd26
1 geänderte Dateien mit 9 neuen und 0 gelöschten Zeilen
  1. 9 0
      Libs/PluginFramework/ctkPluginFrameworkContext.cpp

+ 9 - 0
Libs/PluginFramework/ctkPluginFrameworkContext.cpp

@@ -219,8 +219,17 @@ void ctkPluginFrameworkContext::checkRequirePlugin(ctkPluginPrivate *plugin)
         else if (p2->state == ctkPlugin::INSTALLED) {
           QSet<ctkPluginPrivate*> oldTempResolved = tempResolved;
           tempResolved.insert(p2);
+
+          // TODO check if operation locking is correct in case of
+          // multi-threaded plug-in start up. Maybe refactor out the dependency
+          // checking (use the "package" lock)
+          ctkPluginPrivate::Locker sync(&p2->operationLock);
+          p2->operation.fetchAndStoreOrdered(ctkPluginPrivate::RESOLVING);
           checkRequirePlugin(p2);
           tempResolved = oldTempResolved;
+          p2->state = ctkPlugin::RESOLVED;
+          listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::RESOLVED, p2->q_func()));
+          p2->operation.fetchAndStoreOrdered(ctkPluginPrivate::IDLE);
           ok = p2;
         }
       }