diff options
author | Gunnar Sletta <gunnar.sletta@digia.com> | 2013-09-28 15:37:43 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-28 21:27:29 +0200 |
commit | 907409c715e715bbf12898f612423c7dd6dc6f49 (patch) | |
tree | a9b4534658ec79ad7be8a9c205980a58cb73f7c5 /src/quick | |
parent | c0b48843018b583fa994454aa96e3cb5ef94c733 (diff) |
Fix crash in tst_qmltest with the new animators.
If the target of a job was deleted while it was running we need
to avoid any operations on that job.
Task-number: QTBUG-33723
Change-Id: Ia86856e7f32465f58e25c87f9c74c99b7cb0caea
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/util/qquickanimatorcontroller.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/quick/util/qquickanimatorcontroller.cpp b/src/quick/util/qquickanimatorcontroller.cpp index 344c64d091..1508797680 100644 --- a/src/quick/util/qquickanimatorcontroller.cpp +++ b/src/quick/util/qquickanimatorcontroller.cpp @@ -76,7 +76,8 @@ void QQuickAnimatorController::advance() for (QSet<QQuickAnimatorJob *>::const_iterator it = activeLeafAnimations.constBegin(); it != activeLeafAnimations.constEnd(); ++it) { - if ((*it)->isTransform()) { + QQuickAnimatorJob *job = *it; + if (job->isTransform() && job->target()) { QQuickTransformAnimatorJob *xform = static_cast<QQuickTransformAnimatorJob *>(*it); xform->transformHelper()->apply(); } @@ -90,7 +91,9 @@ static void qquick_initialize_helper(QAbstractAnimationJob *job, QQuickAnimatorC { if (job->isRenderThreadJob()) { QQuickAnimatorJob *j = static_cast<QQuickAnimatorJob *>(job); - if (j->target() && c->deletedSinceLastFrame.contains(j->target())) + if (!j->target()) + return; + else if (c->deletedSinceLastFrame.contains(j->target())) j->targetWasDeleted(); else j->initialize(c); @@ -115,22 +118,28 @@ void QQuickAnimatorController::beforeNodeSync() job->start(); } starting.clear(); - deletedSinceLastFrame.clear(); for (QSet<QQuickAnimatorJob *>::const_iterator it = activeLeafAnimations.constBegin(); it != activeLeafAnimations.constEnd(); ++it) { - if ((*it)->isTransform()) { + QQuickAnimatorJob *job = *it; + if (!job->target()) + continue; + else if (deletedSinceLastFrame.contains(job->target())) + job->targetWasDeleted(); + else if (job->isTransform()) { QQuickTransformAnimatorJob *xform = static_cast<QQuickTransformAnimatorJob *>(*it); xform->transformHelper()->sync(); } } + deletedSinceLastFrame.clear(); } void QQuickAnimatorController::afterNodeSync() { for (QSet<QQuickAnimatorJob *>::const_iterator it = activeLeafAnimations.constBegin(); it != activeLeafAnimations.constEnd(); ++it) { - if ((*it)->isUniform()) { + QQuickAnimatorJob *job = *it; + if (job->isUniform() && job->target()) { QQuickUniformAnimatorJob *job = static_cast<QQuickUniformAnimatorJob *>(*it); job->afterNodeSync(); } |