Mimetypes v3: Reimplement mime startup phase

Which is used for sanity checking that we don't do expensive things on
startup, e.g. by accessing mime types before registering the plugin
provided mimetypes.

Change-Id: Ib99a5ca3bdd489c86f48dc5fbc83273fc28cc0f9
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
Eike Ziller
2022-02-24 11:23:23 +01:00
parent c906f57d14
commit 53aa9daeba
3 changed files with 35 additions and 5 deletions

View File

@@ -45,6 +45,7 @@
#include "mimeprovider_p.h" #include "mimeprovider_p.h"
#include "mimetype_p.h" #include "mimetype_p.h"
#include "mimeutils.h"
#include <QtCore/QFile> #include <QtCore/QFile>
#include <QtCore/QFileInfo> #include <QtCore/QFileInfo>
@@ -531,6 +532,10 @@ MimeType MimeDatabase::mimeTypeForName(const QString &nameOrAlias) const
{ {
QMutexLocker locker(&d->mutex); QMutexLocker locker(&d->mutex);
if (d->m_startupPhase <= int(MimeStartupPhase::PluginsInitializing))
qWarning("Accessing MimeDatabase for %s before plugins are initialized",
qPrintable(nameOrAlias));
return d->mimeTypeForName(nameOrAlias); return d->mimeTypeForName(nameOrAlias);
} }
@@ -566,6 +571,10 @@ MimeType MimeDatabase::mimeTypeForFile(const QFileInfo &fileInfo, MatchMode mode
{ {
QMutexLocker locker(&d->mutex); QMutexLocker locker(&d->mutex);
if (d->m_startupPhase <= int(MimeStartupPhase::PluginsInitializing))
qWarning("Accessing MimeDatabase for %s before plugins are initialized",
qPrintable(fileInfo.filePath()));
if (fileInfo.isDir()) if (fileInfo.isDir())
return d->mimeTypeForName(QLatin1String("inode/directory")); return d->mimeTypeForName(QLatin1String("inode/directory"));
@@ -619,6 +628,11 @@ MimeType MimeDatabase::mimeTypeForFile(const QString &fileName, MatchMode mode)
{ {
if (mode == MatchExtension) { if (mode == MatchExtension) {
QMutexLocker locker(&d->mutex); QMutexLocker locker(&d->mutex);
if (d->m_startupPhase <= int(MimeStartupPhase::PluginsInitializing))
qWarning("Accessing MimeDatabase for %s before plugins are initialized",
qPrintable(fileName));
const QStringList matches = d->mimeTypeForFileName(fileName); const QStringList matches = d->mimeTypeForFileName(fileName);
const int matchCount = matches.count(); const int matchCount = matches.count();
if (matchCount == 0) { if (matchCount == 0) {
@@ -652,6 +666,10 @@ QList<MimeType> MimeDatabase::mimeTypesForFileName(const QString &fileName) cons
{ {
QMutexLocker locker(&d->mutex); QMutexLocker locker(&d->mutex);
if (d->m_startupPhase <= int(MimeStartupPhase::PluginsInitializing))
qWarning("Accessing MimeDatabase for %s before plugins are initialized",
qPrintable(fileName));
const QStringList matches = d->mimeTypeForFileName(fileName); const QStringList matches = d->mimeTypeForFileName(fileName);
QList<MimeType> mimes; QList<MimeType> mimes;
mimes.reserve(matches.count()); mimes.reserve(matches.count());
@@ -683,6 +701,9 @@ MimeType MimeDatabase::mimeTypeForData(const QByteArray &data) const
{ {
QMutexLocker locker(&d->mutex); QMutexLocker locker(&d->mutex);
if (d->m_startupPhase <= int(MimeStartupPhase::PluginsInitializing))
qWarning("Accessing MimeDatabase for data before plugins are initialized");
int accuracy = 0; int accuracy = 0;
return d->findByData(data, &accuracy); return d->findByData(data, &accuracy);
} }
@@ -812,6 +833,9 @@ QList<MimeType> MimeDatabase::allMimeTypes() const
{ {
QMutexLocker locker(&d->mutex); QMutexLocker locker(&d->mutex);
if (d->m_startupPhase <= int(MimeStartupPhase::PluginsInitializing))
qWarning("Accessing MimeDatabase for all mime types before plugins are initialized");
return d->allMimeTypes(); return d->allMimeTypes();
} }

View File

@@ -116,6 +116,9 @@ private:
public: public:
const QString m_defaultMimeType; const QString m_defaultMimeType;
QMutex mutex; QMutex mutex;
// added for Qt Creator
int m_startupPhase = 0;
}; };
} // namespace Utils } // namespace Utils

View File

@@ -94,11 +94,14 @@ QList<MimeType> allMimeTypes()
void setMimeStartupPhase(MimeStartupPhase phase) void setMimeStartupPhase(MimeStartupPhase phase)
{ {
// auto d = MimeDatabasePrivate::instance(); auto d = MimeDatabasePrivate::instance();
// QMutexLocker locker(&d->mutex); QMutexLocker locker(&d->mutex);
// if (int(phase) != d->m_startupPhase + 1) if (int(phase) != d->m_startupPhase + 1) {
// qWarning("Unexpected jump in MimedDatabase lifetime from %d to %d", d->m_startupPhase, int(phase)); qWarning("Unexpected jump in MimedDatabase lifetime from %d to %d",
// d->m_startupPhase = int(phase); d->m_startupPhase,
int(phase));
}
d->m_startupPhase = int(phase);
} }
void addMimeTypes(const QString &fileName, const QByteArray &data) void addMimeTypes(const QString &fileName, const QByteArray &data)