diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp index fe9943d39bd..c4b0ded8f52 100644 --- a/src/libs/extensionsystem/pluginmanager.cpp +++ b/src/libs/extensionsystem/pluginmanager.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -271,9 +272,10 @@ enum { debugLeaks = 0 }; */ -using namespace ExtensionSystem; -using namespace ExtensionSystem::Internal; using namespace Utils; +using namespace ExtensionSystem::Internal; + +namespace ExtensionSystem { static Internal::PluginManagerPrivate *d = 0; static PluginManager *m_instance = 0; @@ -1232,12 +1234,15 @@ void PluginManagerPrivate::removeObject(QObject *obj) void PluginManagerPrivate::loadPlugins() { QList queue = loadQueue(); + MimeDatabase::setStartupPhase(MimeDatabase::PluginsLoading); foreach (PluginSpec *spec, queue) { loadPlugin(spec, PluginSpec::Loaded); } + MimeDatabase::setStartupPhase(MimeDatabase::PluginsInitializing); foreach (PluginSpec *spec, queue) { loadPlugin(spec, PluginSpec::Initialized); } + MimeDatabase::setStartupPhase(MimeDatabase::PluginsDelayedInitializing); Utils::reverseForeach(queue, [this](PluginSpec *spec) { loadPlugin(spec, PluginSpec::Running); if (spec->state() == PluginSpec::Running) { @@ -1248,6 +1253,7 @@ void PluginManagerPrivate::loadPlugins() } }); emit q->pluginsChanged(); + MimeDatabase::setStartupPhase(MimeDatabase::UpAndRunning); delayedInitializeTimer = new QTimer; delayedInitializeTimer->setInterval(DELAYED_INITIALIZE_INTERVAL); @@ -1699,3 +1705,5 @@ QObject *PluginManager::getObjectByClassName(const QString &className) return obj->inherits(ba.constData()); }); } + +} // ExtensionSystem diff --git a/src/libs/utils/mimetypes/mimedatabase.cpp b/src/libs/utils/mimetypes/mimedatabase.cpp index 20bf4d83c89..a53967974e1 100644 --- a/src/libs/utils/mimetypes/mimedatabase.cpp +++ b/src/libs/utils/mimetypes/mimedatabase.cpp @@ -335,6 +335,11 @@ void MimeDatabase::addMimeTypes(const QString &fileName) { auto d = MimeDatabasePrivate::instance(); QMutexLocker locker(&d->mutex); + + if (d->m_startupPhase >= MimeDatabase::PluginsDelayedInitializing) + qWarning("Adding items from %s to MimeDatabase after initialization time", + qPrintable(fileName)); + auto xmlProvider = static_cast(d->provider()); xmlProvider->addFile(fileName); } @@ -364,11 +369,19 @@ QString MimeDatabase::allFiltersString(QString *allFilesFilter) QString MimeDatabase::allFilesFilterString() { + auto d = MimeDatabasePrivate::instance(); + if (d->m_startupPhase <= MimeDatabase::PluginsInitializing) + qWarning("Accessing MimeDatabase files filter strings before plugins are initialized"); + return QCoreApplication::translate("Core", ALL_FILES_FILTER.source, ALL_FILES_FILTER.comment); } QStringList MimeDatabase::allGlobPatterns() { + auto d = MimeDatabasePrivate::instance(); + if (d->m_startupPhase <= MimeDatabase::PluginsInitializing) + qWarning("Accessing MimeDatabase glob patterns before plugins are initialized"); + MimeDatabase mdb; QStringList patterns; foreach (const MimeType &mt, mdb.allMimeTypes()) @@ -384,6 +397,9 @@ MimeType MimeDatabase::mimeTypeForName(const QString &nameOrAlias) const { QMutexLocker locker(&d->mutex); + if (d->m_startupPhase <= MimeDatabase::PluginsInitializing) + qWarning("Accessing MimeDatabase for %s before plugins are initialized", qPrintable(nameOrAlias)); + return d->mimeTypeForName(nameOrAlias); } @@ -686,3 +702,12 @@ void MimeDatabase::setMagicRulesForMimeType(const MimeType &mimeType, const QMap QMutexLocker locker(&d->mutex); return d->provider()->setMagicRulesForMimeType(mimeType, rules); } + +void MimeDatabase::setStartupPhase(MimeDatabase::StartupPhase phase) +{ + auto d = MimeDatabasePrivate::instance(); + QMutexLocker locker(&d->mutex); + if (phase != d->m_startupPhase + 1) + qWarning("Unexpected jump in MimedDatabase lifetime from %d to %d", d->m_startupPhase, phase); + d->m_startupPhase = phase; +} diff --git a/src/libs/utils/mimetypes/mimedatabase.h b/src/libs/utils/mimetypes/mimedatabase.h index 7f85c7a7f28..a31ef26c931 100644 --- a/src/libs/utils/mimetypes/mimedatabase.h +++ b/src/libs/utils/mimetypes/mimedatabase.h @@ -98,6 +98,16 @@ public: static void setMagicRulesForMimeType(const MimeType &mimeType, const QMap > &rules); // priority -> rules + // For debugging purposes. + enum StartupPhase { + BeforeInitialize, + PluginsLoading, + PluginsInitializing, // Register up to here. + PluginsDelayedInitializing, // Use from here on. + UpAndRunning + }; + static void setStartupPhase(StartupPhase); + private: Internal::MimeDatabasePrivate *d; }; diff --git a/src/libs/utils/mimetypes/mimedatabase_p.h b/src/libs/utils/mimetypes/mimedatabase_p.h index b576cada8f3..41a14394094 100644 --- a/src/libs/utils/mimetypes/mimedatabase_p.h +++ b/src/libs/utils/mimetypes/mimedatabase_p.h @@ -96,6 +96,8 @@ public: mutable MimeProviderBase *m_provider; const QString m_defaultMimeType; QMutex mutex; + + int m_startupPhase = 0; }; } // Internal