diff options
author | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2018-05-24 20:50:32 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2018-06-01 09:34:33 +0000 |
commit | 1ddfb443b686ef04cc0e28363308ce70d01f0d73 (patch) | |
tree | 2bcebca79e402ddf5b87b0cb2f1e9dbb4f96464e | |
parent | 760a63293673271b74fdeac3d574f6113975078f (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.cpp | 6 | ||||
-rw-r--r-- | src/shared/proparser/qmakeparser.h | 2 | ||||
-rw-r--r-- | src/shared/proparser/qmakevfs.cpp | 13 | ||||
-rw-r--r-- | src/shared/proparser/qmakevfs.h | 3 |
4 files changed, 21 insertions, 3 deletions
diff --git a/src/shared/proparser/qmakeparser.cpp b/src/shared/proparser/qmakeparser.cpp index 6b0ae22e83d..8d6ef622fd0 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 0612b922620..a0c1ca17f18 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 c5c5b75c749..f438978badc 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 34dd96fd7b7..00547cf7fce 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); |