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

View File

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

View File

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