diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-01-05 10:19:19 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-01-05 10:03:41 +0000 |
commit | 3456b4eb249d49239ec3cf822db950b8e20bb789 (patch) | |
tree | b199450629a9093007384765c96ebf7cd4bec47b /src/imports/controls/qquickbusyindicatorring.cpp | |
parent | ac59e18a83b2ca524d03c937bd7ed7cbcfa3393a (diff) |
Busy animators: fix access to childContainerNode()
Accessing QQuickItemPrivate::childContainerNode() in updateCurrentTime(),
which is executed in render thread context, is not safe and may cause
random crashes.
Change-Id: Ibbdf387f7e8d593740452e56b819a6d7fd9341e6
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
Diffstat (limited to 'src/imports/controls/qquickbusyindicatorring.cpp')
-rw-r--r-- | src/imports/controls/qquickbusyindicatorring.cpp | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/imports/controls/qquickbusyindicatorring.cpp b/src/imports/controls/qquickbusyindicatorring.cpp index 4711ae1b..18413b73 100644 --- a/src/imports/controls/qquickbusyindicatorring.cpp +++ b/src/imports/controls/qquickbusyindicatorring.cpp @@ -50,9 +50,14 @@ public: QQuickBusyIndicatorAnimatorJob(); ~QQuickBusyIndicatorAnimatorJob(); + void initialize(QQuickAnimatorController *controller) Q_DECL_OVERRIDE; void updateCurrentTime(int time) Q_DECL_OVERRIDE; void writeBack() Q_DECL_OVERRIDE; void nodeWasDestroyed() Q_DECL_OVERRIDE; + void afterNodeSync() Q_DECL_OVERRIDE; + +private: + QSGNode *m_node; }; static const int circles = 10; @@ -153,7 +158,7 @@ QQuickAnimatorJob *QQuickBusyIndicatorAnimator::createJob() const return new QQuickBusyIndicatorAnimatorJob; } -QQuickBusyIndicatorAnimatorJob::QQuickBusyIndicatorAnimatorJob() +QQuickBusyIndicatorAnimatorJob::QQuickBusyIndicatorAnimatorJob() : m_node(Q_NULLPTR) { } @@ -161,13 +166,18 @@ QQuickBusyIndicatorAnimatorJob::~QQuickBusyIndicatorAnimatorJob() { } +void QQuickBusyIndicatorAnimatorJob::initialize(QQuickAnimatorController *controller) +{ + QQuickAnimatorJob::initialize(controller); + m_node = QQuickItemPrivate::get(m_target)->childContainerNode(); +} + void QQuickBusyIndicatorAnimatorJob::updateCurrentTime(int time) { - if (!m_target) + if (!m_node) return; - QSGNode *childContainerNode = QQuickItemPrivate::get(m_target)->childContainerNode(); - QSGSimpleRectNode *rootRectNode = static_cast<QSGSimpleRectNode*>(childContainerNode->firstChild()); + QSGSimpleRectNode *rootRectNode = static_cast<QSGSimpleRectNode*>(m_node->firstChild()); if (!rootRectNode) return; @@ -204,6 +214,12 @@ void QQuickBusyIndicatorAnimatorJob::writeBack() void QQuickBusyIndicatorAnimatorJob::nodeWasDestroyed() { + m_node = Q_NULLPTR; +} + +void QQuickBusyIndicatorAnimatorJob::afterNodeSync() +{ + m_node = QQuickItemPrivate::get(m_target)->childContainerNode(); } QT_END_NAMESPACE |