summaryrefslogtreecommitdiffstats
path: root/src/render/framegraph/qrendercapture.cpp
diff options
context:
space:
mode:
authorMäättä Antti <antti.maatta@qt.io>2017-06-19 11:13:41 +0300
committerAntti Määttä <antti.maatta@qt.io>2017-06-21 11:03:29 +0000
commit927cdc4bde6a152fcd0a64729946831477f27913 (patch)
tree48502ba55616b853a2789e7ef247ead0716bc3d0 /src/render/framegraph/qrendercapture.cpp
parent920e9ecef384058e8f44eea09dfafda03a9ec435 (diff)
Fix QRenderCaptureReply deallocation
Add deallocation guard and set parent of the reply. Task-number: QTBUG-61508 Change-Id: Ia299450d792b2254c2944472382c8241b271ebf6 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/framegraph/qrendercapture.cpp')
-rw-r--r--src/render/framegraph/qrendercapture.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/render/framegraph/qrendercapture.cpp b/src/render/framegraph/qrendercapture.cpp
index f3e5d53ee..8ae97b8f0 100644
--- a/src/render/framegraph/qrendercapture.cpp
+++ b/src/render/framegraph/qrendercapture.cpp
@@ -41,6 +41,7 @@
#include <Qt3DRender/qframegraphnodecreatedchange.h>
#include <QPointer>
+#include <QMutexLocker>
QT_BEGIN_NAMESPACE
@@ -240,8 +241,19 @@ QRenderCapturePrivate::QRenderCapturePrivate()
/*!
* \internal
*/
+QRenderCapturePrivate::~QRenderCapturePrivate()
+{
+ Q_Q(QRenderCapture);
+ for (QRenderCaptureReply *reply : m_waitingReplies)
+ reply->disconnect(q);
+}
+
+/*!
+ * \internal
+ */
QRenderCaptureReply *QRenderCapturePrivate::createReply(int captureId)
{
+ QMutexLocker lock(&m_mutex);
QRenderCaptureReply *reply = new QRenderCaptureReply();
reply->d_func()->m_captureId = captureId;
m_waitingReplies.push_back(reply);
@@ -254,6 +266,7 @@ QRenderCaptureReply *QRenderCapturePrivate::createReply(int captureId)
QRenderCaptureReply *QRenderCapturePrivate::takeReply(int captureId)
{
QRenderCaptureReply *reply = nullptr;
+ QMutexLocker lock(&m_mutex);
for (int i = 0; i < m_waitingReplies.size(); ++i) {
if (m_waitingReplies[i]->d_func()->m_captureId == captureId) {
reply = m_waitingReplies[i];
@@ -274,6 +287,15 @@ void QRenderCapturePrivate::setImage(QRenderCaptureReply *reply, const QImage &i
}
/*!
+ * \internal
+ */
+void QRenderCapturePrivate::replyDestroyed(QRenderCaptureReply *reply)
+{
+ QMutexLocker lock(&m_mutex);
+ m_waitingReplies.removeAll(reply);
+}
+
+/*!
* The constructor creates an instance with the specified \a parent.
*/
QRenderCapture::QRenderCapture(Qt3DCore::QNode *parent)
@@ -293,6 +315,10 @@ QRenderCaptureReply *QRenderCapture::requestCapture(int captureId)
{
Q_D(QRenderCapture);
QRenderCaptureReply *reply = d->createReply(captureId);
+ reply->setParent(this);
+ QObject::connect(reply, &QObject::destroyed, this, [&, reply, d] (QObject *) {
+ d->replyDestroyed(reply);
+ });
Qt3DCore::QPropertyUpdatedChangePtr change(new Qt3DCore::QPropertyUpdatedChange(id()));
change->setPropertyName(QByteArrayLiteral("renderCaptureRequest"));
@@ -313,6 +339,10 @@ QRenderCaptureReply *QRenderCapture::requestCapture()
Q_D(QRenderCapture);
static int captureId = 1;
QRenderCaptureReply *reply = d->createReply(captureId);
+ reply->setParent(this);
+ QObject::connect(reply, &QObject::destroyed, this, [&, reply, d] (QObject *) {
+ d->replyDestroyed(reply);
+ });
Qt3DCore::QPropertyUpdatedChangePtr change(new Qt3DCore::QPropertyUpdatedChange(id()));
change->setPropertyName(QByteArrayLiteral("renderCaptureRequest"));