diff options
author | Määttä Antti <antti.maatta@qt.io> | 2017-06-19 11:13:41 +0300 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2017-06-21 11:03:29 +0000 |
commit | 927cdc4bde6a152fcd0a64729946831477f27913 (patch) | |
tree | 48502ba55616b853a2789e7ef247ead0716bc3d0 /src/render/framegraph/qrendercapture.cpp | |
parent | 920e9ecef384058e8f44eea09dfafda03a9ec435 (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.cpp | 30 |
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")); |