diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2016-05-20 17:11:37 +0200 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-05-23 16:31:55 +0000 |
commit | 073930f2ef030b3019c323999d910185f4639d9b (patch) | |
tree | 0c2bba252f7a92d4f3841fbe42eeca27e2a8a838 /src/render/framegraph/qrenderpassfilter.cpp | |
parent | 15dace7c02bc5acdf02f94c8be08fec1a792383c (diff) |
Shared node bookkeeping
Any time a property references a QNode there is a risk that the node gets
destroyed and then the property is left pointing to a dangling pointer.
To handle such cases, setters of such properties are able to use a helper
that internally connect QObject::destroyed signal to a setter removal method.
Change-Id: I42428c851d0e3d2d88ab0cf6a5b75605334ec648
Task-number: QTBUG-53456
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/framegraph/qrenderpassfilter.cpp')
-rw-r--r-- | src/render/framegraph/qrenderpassfilter.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/render/framegraph/qrenderpassfilter.cpp b/src/render/framegraph/qrenderpassfilter.cpp index 202a10a35..21f90a998 100644 --- a/src/render/framegraph/qrenderpassfilter.cpp +++ b/src/render/framegraph/qrenderpassfilter.cpp @@ -81,6 +81,9 @@ void QRenderPassFilter::addMatch(QFilterKey *filterKey) if (!d->m_matchList.contains(filterKey)) { d->m_matchList.append(filterKey); + // Ensures proper bookkeeping + d->registerDestructionHelper(filterKey, &QRenderPassFilter::removeMatch, d->m_matchList); + // We need to add it as a child of the current node if it has been declared inline // Or not previously added as a child of the current node so that // 1) The backend gets notified about it's creation @@ -107,6 +110,8 @@ void QRenderPassFilter::removeMatch(QFilterKey *filterKey) d->notifyObservers(change); } d->m_matchList.removeOne(filterKey); + // Remove bookkeeping connection + d->unregisterDestructionHelper(filterKey); } void QRenderPassFilter::addParameter(QParameter *parameter) @@ -116,6 +121,9 @@ void QRenderPassFilter::addParameter(QParameter *parameter) if (!d->m_parameters.contains(parameter)) { d->m_parameters.append(parameter); + // Ensures proper bookkeeping + d->registerDestructionHelper(parameter, &QRenderPassFilter::removeParameter, d->m_parameters); + // We need to add it as a child of the current node if it has been declared inline // Or not previously added as a child of the current node so that // 1) The backend gets notified about it's creation @@ -142,6 +150,8 @@ void QRenderPassFilter::removeParameter(QParameter *parameter) d->notifyObservers(change); } d->m_parameters.removeOne(parameter); + // Remove bookkeeping connection + d->unregisterDestructionHelper(parameter); } QVector<QParameter *> QRenderPassFilter::parameters() const |