forked from qt-creator/qt-creator
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:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user