summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread/qfutureinterface_p.h
diff options
context:
space:
mode:
authorChristian Strømme <christian.stromme@digia.com>2012-10-25 12:32:52 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-11-01 16:09:29 +0100
commit731ba8ed08f80644b403556638c7f6229e678ebe (patch)
tree437ce138749ffc39a6ee17d77b1fc0d393d44aa7 /src/corelib/thread/qfutureinterface_p.h
parentd45cebbf4d6a8fd2406f41e151a63c9f241879f7 (diff)
Fix for leak in QFuture
To avoid leaking when converting a QFuture<T> to a QFuture<void> we need to have a separate ref. counter for QFuture<T>. When the last QFuture<T> goes out of scope, we need to clean out the result data. Task-number: QTBUG-27224 Change-Id: I965a64a11fffbb191ab979cdd030a9aafd4436c2 Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
Diffstat (limited to 'src/corelib/thread/qfutureinterface_p.h')
-rw-r--r--src/corelib/thread/qfutureinterface_p.h26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/corelib/thread/qfutureinterface_p.h b/src/corelib/thread/qfutureinterface_p.h
index a9081d4c89..ece5e56768 100644
--- a/src/corelib/thread/qfutureinterface_p.h
+++ b/src/corelib/thread/qfutureinterface_p.h
@@ -129,7 +129,31 @@ class QFutureInterfaceBasePrivate
public:
QFutureInterfaceBasePrivate(QFutureInterfaceBase::State initialState);
- QAtomicInt refCount;
+ // When the last QFuture<T> reference is removed, we need to make
+ // sure that data stored in the ResultStore is cleaned out.
+ // Since QFutureInterfaceBasePrivate can be shared between QFuture<T>
+ // and QFuture<void> objects, we use a separate ref. counter
+ // to keep track of QFuture<T> objects.
+ class RefCount
+ {
+ public:
+ inline RefCount(int r = 0, int rt = 0)
+ : m_refCount(r), m_refCountT(rt) {}
+ // Default ref counter for QFIBP
+ inline bool ref() { return m_refCount.ref(); }
+ inline bool deref() { return m_refCount.deref(); }
+ inline int load() const { return m_refCount.load(); }
+ // Ref counter for type T
+ inline bool refT() { return m_refCountT.ref(); }
+ inline bool derefT() { return m_refCountT.deref(); }
+ inline int loadT() const { return m_refCountT.load(); }
+
+ private:
+ QAtomicInt m_refCount;
+ QAtomicInt m_refCountT;
+ };
+
+ RefCount refCount;
mutable QMutex m_mutex;
QWaitCondition waitCondition;
QList<QFutureCallOutInterface *> outputConnections;