MimeDatabase: Add some startup phase tracking

... to warn about situations where Mime types are registered too
late (i.e. after Plugin::initialize() or used too early (i.e. before
Plugin::extensionsInitialized())

Change-Id: I22681e94bfdd508e954bb3457b834ec3ad1f0fee
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2017-01-11 10:48:29 +01:00
parent 4dfbcecaa2
commit 0b36c75ee0
4 changed files with 47 additions and 2 deletions

View File

@@ -49,6 +49,7 @@
#include <utils/algorithm.h>
#include <utils/executeondestruction.h>
#include <utils/hostosinfo.h>
#include <utils/mimetypes/mimedatabase.h>
#include <utils/qtcassert.h>
#include <utils/synchronousprocess.h>
@@ -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<PluginSpec *> 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

View File

@@ -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<MimeXMLProvider *>(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;
}

View File

@@ -98,6 +98,16 @@ public:
static void setMagicRulesForMimeType(const MimeType &mimeType,
const QMap<int, QList<Internal::MimeMagicRule> > &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;
};

View File

@@ -96,6 +96,8 @@ public:
mutable MimeProviderBase *m_provider;
const QString m_defaultMimeType;
QMutex mutex;
int m_startupPhase = 0;
};
} // Internal