aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@digia.com>2013-09-28 15:37:43 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-28 21:27:29 +0200
commit907409c715e715bbf12898f612423c7dd6dc6f49 (patch)
treea9b4534658ec79ad7be8a9c205980a58cb73f7c5 /src/quick
parentc0b48843018b583fa994454aa96e3cb5ef94c733 (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.cpp19
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();
}