aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@qt.io>2018-05-24 20:50:32 +0200
committerOswald Buddenhagen <oswald.buddenhagen@qt.io>2018-06-01 09:34:33 +0000
commit1ddfb443b686ef04cc0e28363308ce70d01f0d73 (patch)
tree2bcebca79e402ddf5b87b0cb2f1e9dbb4f96464e
parent760a63293673271b74fdeac3d574f6113975078f (diff)
qmake: fix file id mapping lifetime management, take 2v4.6.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>
-rw-r--r--src/shared/proparser/qmakeparser.cpp6
-rw-r--r--src/shared/proparser/qmakeparser.h2
-rw-r--r--src/shared/proparser/qmakevfs.cpp13
-rw-r--r--src/shared/proparser/qmakevfs.h3
4 files changed, 21 insertions, 3 deletions
diff --git a/src/shared/proparser/qmakeparser.cpp b/src/shared/proparser/qmakeparser.cpp
index 6b0ae22e83..8d6ef622fd 100644
--- a/src/shared/proparser/qmakeparser.cpp
+++ b/src/shared/proparser/qmakeparser.cpp
@@ -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)
diff --git a/src/shared/proparser/qmakeparser.h b/src/shared/proparser/qmakeparser.h
index 0612b92262..a0c1ca17f1 100644
--- a/src/shared/proparser/qmakeparser.h
+++ b/src/shared/proparser/qmakeparser.h
@@ -197,7 +197,7 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QMakeParser::ParseFlags)
class QMAKE_EXPORT ProFileCache
{
public:
- ProFileCache() {}
+ ProFileCache();
~ProFileCache();
void discardFile(int id);
diff --git a/src/shared/proparser/qmakevfs.cpp b/src/shared/proparser/qmakevfs.cpp
index c5c5b75c74..f438978bad 100644
--- a/src/shared/proparser/qmakevfs.cpp
+++ b/src/shared/proparser/qmakevfs.cpp
@@ -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
diff --git a/src/shared/proparser/qmakevfs.h b/src/shared/proparser/qmakevfs.h
index 34dd96fd7b..00547cf7fc 100644
--- a/src/shared/proparser/qmakevfs.h
+++ b/src/shared/proparser/qmakevfs.h
@@ -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);