Add "delayedInitialize" feature to plugin manager.

And use it for some of the plugins. It avoids the plugins to
do the timing on their own, and actually adds guarantees about
the order the delayed initialization is done.

Change-Id: I88ad9b46b24b82c91509774170fe0e7e99e88e4b
Reviewed-by: Tobias Hunger <tobias.hunger@nokia.com>
This commit is contained in:
Eike Ziller
2012-02-02 10:47:33 +01:00
parent 8a25c5352b
commit de290e0341
16 changed files with 124 additions and 32 deletions

View File

@@ -55,6 +55,7 @@
static const char C_IGNORED_PLUGINS[] = "Plugins/Ignored";
static const char C_FORCEENABLED_PLUGINS[] = "Plugins/ForceEnabled";
static const int DELAYED_INITIALIZE_INTERVAL = 20; // ms
typedef QList<ExtensionSystem::PluginSpec *> PluginSpecSet;
@@ -782,12 +783,32 @@ PluginSpecPrivate *PluginManagerPrivate::privateSpec(PluginSpec *spec)
return spec->d;
}
void PluginManagerPrivate::nextDelayedInitialize()
{
while (!delayedInitializeQueue.isEmpty()) {
PluginSpec *spec = delayedInitializeQueue.takeFirst();
profilingReport(">delayedInitialize", spec);
bool delay = spec->d->delayedInitialize();
profilingReport("<delayedInitialize", spec);
if (delay)
break; // do next delayedInitialize after a delay
}
if (delayedInitializeQueue.isEmpty()) {
delete delayedInitializeTimer;
delayedInitializeTimer = 0;
} else {
delayedInitializeTimer->start();
}
}
/*!
\fn PluginManagerPrivate::PluginManagerPrivate(PluginManager *pluginManager)
\internal
*/
PluginManagerPrivate::PluginManagerPrivate(PluginManager *pluginManager) :
extension(QLatin1String("xml")),
delayedInitializeTimer(0),
shutdownEventLoop(0),
m_profileElapsedMS(0),
m_profilingVerbosity(0),
settings(0),
@@ -849,6 +870,11 @@ void PluginManagerPrivate::readSettings()
*/
void PluginManagerPrivate::stopAll()
{
if (delayedInitializeTimer && delayedInitializeTimer->isActive()) {
delayedInitializeTimer->stop();
delete delayedInitializeTimer;
delayedInitializeTimer = 0;
}
QList<PluginSpec *> queue = loadQueue();
foreach (PluginSpec *spec, queue) {
loadPlugin(spec, PluginSpec::Stopped);
@@ -941,9 +967,19 @@ void PluginManagerPrivate::loadPlugins()
QListIterator<PluginSpec *> it(queue);
it.toBack();
while (it.hasPrevious()) {
loadPlugin(it.previous(), PluginSpec::Running);
PluginSpec *spec = it.previous();
loadPlugin(spec, PluginSpec::Running);
if (spec->state() == PluginSpec::Running)
delayedInitializeQueue.append(spec);
}
emit q->pluginsChanged();
delayedInitializeTimer = new QTimer;
delayedInitializeTimer->setInterval(DELAYED_INITIALIZE_INTERVAL);
delayedInitializeTimer->setSingleShot(true);
connect(delayedInitializeTimer, SIGNAL(timeout()),
this, SLOT(nextDelayedInitialize()));
delayedInitializeTimer->start();
}
/*!