Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec845a21 authored by John Reck's avatar John Reck
Browse files

Fix race condition

 Bug: 17372309

 AnimationContext::startFrame() happens both with and without
 the UI thread lock. Pass the TraversalMode into it so
 that ThreadedRenderer's subclass can correctly decide
 when it is safe to push over mPendingAnimatingRenderNodes, as doing
 so outside of the lock is Very Bad.

Change-Id: Ife5dd3a2b46b0a207cd9234c159a674afdbf5efd
parent c237555c
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -158,9 +158,11 @@ public:

    // Marks the start of a frame, which will update the frame time and move all
    // next frame animations into the current frame
    virtual void startFrame() {
    virtual void startFrame(TreeInfo::TraversalMode mode) {
        if (mode == TreeInfo::MODE_FULL) {
            mRootNode->doAttachAnimatingNodes(this);
        AnimationContext::startFrame();
        }
        AnimationContext::startFrame(mode);
    }

    // Runs any animations still left in mCurrentFrameAnimations
+2 −3
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@

#include "Animator.h"
#include "RenderNode.h"
#include "TreeInfo.h"
#include "renderthread/TimeLord.h"

namespace android {
@@ -34,7 +33,7 @@ AnimationContext::~AnimationContext() {
}

void AnimationContext::destroy() {
    startFrame();
    startFrame(TreeInfo::MODE_RT_ONLY);
    while (mCurrentFrameAnimations.mNextHandle) {
        AnimationHandle* current = mCurrentFrameAnimations.mNextHandle;
        AnimatorManager& animators = current->mRenderNode->animators();
@@ -55,7 +54,7 @@ void AnimationContext::addAnimationHandle(AnimationHandle* handle) {
    handle->insertAfter(&mNextFrameAnimations);
}

void AnimationContext::startFrame() {
void AnimationContext::startFrame(TreeInfo::TraversalMode mode) {
    LOG_ALWAYS_FATAL_IF(mCurrentFrameAnimations.mNextHandle,
            "Missed running animations last frame!");
    AnimationHandle* head = mNextFrameAnimations.mNextHandle;
+2 −2
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <utils/RefBase.h>
#include <utils/StrongPointer.h>

#include "TreeInfo.h"
#include "renderthread/TimeLord.h"
#include "utils/Macros.h"

@@ -30,7 +31,6 @@ class AnimationContext;
class AnimationListener;
class BaseRenderNodeAnimator;
class RenderNode;
class TreeInfo;

/*
 * AnimationHandle is several classes merged into one.
@@ -90,7 +90,7 @@ public:

    // Marks the start of a frame, which will update the frame time and move all
    // next frame animations into the current frame
    ANDROID_API virtual void startFrame();
    ANDROID_API virtual void startFrame(TreeInfo::TraversalMode mode);

    // Runs any animations still left in mCurrentFrameAnimations that were not run
    // as part of the standard RenderNode:prepareTree pass.
+1 −1
Original line number Diff line number Diff line
@@ -150,7 +150,7 @@ void CanvasContext::prepareTree(TreeInfo& info) {
    if (mPrefetechedLayers.size() && info.mode == TreeInfo::MODE_FULL) {
        info.canvasContext = this;
    }
    mAnimationContext->startFrame();
    mAnimationContext->startFrame(info.mode);
    mRootRenderNode->prepareTree(info);
    mAnimationContext->runRemainingAnimations(info);