qmake: fix file id mapping lifetime management, take 2

turns out that ref-counting the vfs class is insufficient, as now the
ProFile cache (which expires after a timeout) could outlive all VFS
instances and thus refer to ids which were discarded and later re-used.

to avoid this, we let the cache instance hold a reference to the vfs
class.

amends d03fb3506.

Task-number: QTCREATORBUG-20524
Change-Id: Idd4478ffc1c2405b3b83df32fba45b1f687f6a18
Reviewed-by: Robert Loehning <robert.loehning@qt.io>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Oswald Buddenhagen
2018-05-24 20:50:32 +02:00
parent 760a632936
commit 1ddfb443b6
4 changed files with 21 additions and 3 deletions

View File

@@ -42,11 +42,17 @@ QT_BEGIN_NAMESPACE
//
///////////////////////////////////////////////////////////////////////
ProFileCache::ProFileCache()
{
QMakeVfs::ref();
}
ProFileCache::~ProFileCache()
{
foreach (const Entry &ent, parsed_files)
if (ent.pro)
ent.pro->deref();
QMakeVfs::deref();
}
void ProFileCache::discardFile(const QString &fileName, QMakeVfs *vfs)

View File

@@ -197,7 +197,7 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QMakeParser::ParseFlags)
class QMAKE_EXPORT ProFileCache
{
public:
ProFileCache() {}
ProFileCache();
~ProFileCache();
void discardFile(int id);

View File

@@ -49,13 +49,23 @@ QMakeVfs::QMakeVfs()
#ifndef QT_NO_TEXTCODEC
m_textCodec = 0;
#endif
ref();
}
QMakeVfs::~QMakeVfs()
{
deref();
}
void QMakeVfs::ref()
{
#ifdef PROEVALUATOR_THREAD_SAFE
QMutexLocker locker(&s_mutex);
#endif
++s_refCount;
}
QMakeVfs::~QMakeVfs()
void QMakeVfs::deref()
{
#ifdef PROEVALUATOR_THREAD_SAFE
QMutexLocker locker(&s_mutex);
@@ -67,7 +77,6 @@ QMakeVfs::~QMakeVfs()
}
}
#ifdef PROPARSER_THREAD_SAFE
QMutex QMakeVfs::s_mutex;
#endif

View File

@@ -74,6 +74,9 @@ public:
QMakeVfs();
~QMakeVfs();
static void ref();
static void deref();
int idForFileName(const QString &fn, VfsFlags flags);
QString fileNameForId(int id);
bool writeFile(int id, QIODevice::OpenMode mode, VfsFlags flags, const QString &contents, QString *errStr);