Loading services/core/java/com/android/server/wm/BoundsAnimationController.java +12 −0 Original line number Diff line number Diff line Loading @@ -206,6 +206,10 @@ public class BoundsAnimationController { mTmpRect.set(mFrom.left, mFrom.top, mFrom.left + mFrozenTaskWidth, mFrom.top + mFrozenTaskHeight); // Boost the thread priority of the animation thread while the bounds animation is // running updateBooster(); // Ensure that we have prepared the target for animation before // we trigger any size changes, so it can swap surfaces // in to appropriate modes, or do as it wishes otherwise. Loading Loading @@ -316,6 +320,9 @@ public class BoundsAnimationController { removeListener(this); removeUpdateListener(this); mRunningAnimations.remove(mTarget); // Reset the thread priority of the animation thread after the bounds animation is done updateBooster(); } @Override Loading Loading @@ -446,4 +453,9 @@ public class BoundsAnimationController { b.resume(); } } private void updateBooster() { WindowManagerService.sThreadPriorityBooster.setBoundsAnimationRunning( !mRunningAnimations.isEmpty()); } } services/core/java/com/android/server/wm/WindowManagerThreadPriorityBooster.java +30 −12 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static android.os.Process.setThreadPriority; import static com.android.server.LockGuard.INDEX_WINDOW; import static com.android.server.am.ActivityManagerService.TOP_APP_PRIORITY_BOOST; import com.android.internal.annotations.GuardedBy; import com.android.server.AnimationThread; import com.android.server.ThreadPriorityBooster; Loading @@ -32,12 +33,18 @@ import com.android.server.ThreadPriorityBooster; */ class WindowManagerThreadPriorityBooster extends ThreadPriorityBooster { private final AnimationThread mAnimationThread; private final Object mLock = new Object(); private final int mAnimationThreadId; @GuardedBy("mLock") private boolean mAppTransitionRunning; @GuardedBy("mLock") private boolean mBoundsAnimationRunning; WindowManagerThreadPriorityBooster() { super(THREAD_PRIORITY_DISPLAY, INDEX_WINDOW); mAnimationThread = AnimationThread.get(); mAnimationThreadId = AnimationThread.get().getThreadId(); } @Override Loading @@ -45,7 +52,7 @@ class WindowManagerThreadPriorityBooster extends ThreadPriorityBooster { // Do not boost the animation thread. As the animation thread is changing priorities, // boosting it might mess up the priority because we reset it the the previous priority. if (myTid() == mAnimationThread.getThreadId()) { if (myTid() == mAnimationThreadId) { return; } super.boost(); Loading @@ -55,24 +62,35 @@ class WindowManagerThreadPriorityBooster extends ThreadPriorityBooster { public void reset() { // See comment in boost(). if (myTid() == mAnimationThread.getThreadId()) { if (myTid() == mAnimationThreadId) { return; } super.reset(); } void setAppTransitionRunning(boolean running) { if (mAppTransitionRunning == running) { return; synchronized (mLock) { if (mAppTransitionRunning != running) { mAppTransitionRunning = running; updatePriorityLocked(); } } } final int priority = calculatePriority(running); setBoostToPriority(priority); setThreadPriority(mAnimationThread.getThreadId(), priority); mAppTransitionRunning = running; void setBoundsAnimationRunning(boolean running) { synchronized (mLock) { if (mBoundsAnimationRunning != running) { mBoundsAnimationRunning = running; updatePriorityLocked(); } } } private int calculatePriority(boolean appTransitionRunning) { return appTransitionRunning ? TOP_APP_PRIORITY_BOOST : THREAD_PRIORITY_DISPLAY; @GuardedBy("mLock") private void updatePriorityLocked() { int priority = (mAppTransitionRunning || mBoundsAnimationRunning) ? TOP_APP_PRIORITY_BOOST : THREAD_PRIORITY_DISPLAY; setBoostToPriority(priority); setThreadPriority(mAnimationThreadId, priority); } } Loading
services/core/java/com/android/server/wm/BoundsAnimationController.java +12 −0 Original line number Diff line number Diff line Loading @@ -206,6 +206,10 @@ public class BoundsAnimationController { mTmpRect.set(mFrom.left, mFrom.top, mFrom.left + mFrozenTaskWidth, mFrom.top + mFrozenTaskHeight); // Boost the thread priority of the animation thread while the bounds animation is // running updateBooster(); // Ensure that we have prepared the target for animation before // we trigger any size changes, so it can swap surfaces // in to appropriate modes, or do as it wishes otherwise. Loading Loading @@ -316,6 +320,9 @@ public class BoundsAnimationController { removeListener(this); removeUpdateListener(this); mRunningAnimations.remove(mTarget); // Reset the thread priority of the animation thread after the bounds animation is done updateBooster(); } @Override Loading Loading @@ -446,4 +453,9 @@ public class BoundsAnimationController { b.resume(); } } private void updateBooster() { WindowManagerService.sThreadPriorityBooster.setBoundsAnimationRunning( !mRunningAnimations.isEmpty()); } }
services/core/java/com/android/server/wm/WindowManagerThreadPriorityBooster.java +30 −12 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static android.os.Process.setThreadPriority; import static com.android.server.LockGuard.INDEX_WINDOW; import static com.android.server.am.ActivityManagerService.TOP_APP_PRIORITY_BOOST; import com.android.internal.annotations.GuardedBy; import com.android.server.AnimationThread; import com.android.server.ThreadPriorityBooster; Loading @@ -32,12 +33,18 @@ import com.android.server.ThreadPriorityBooster; */ class WindowManagerThreadPriorityBooster extends ThreadPriorityBooster { private final AnimationThread mAnimationThread; private final Object mLock = new Object(); private final int mAnimationThreadId; @GuardedBy("mLock") private boolean mAppTransitionRunning; @GuardedBy("mLock") private boolean mBoundsAnimationRunning; WindowManagerThreadPriorityBooster() { super(THREAD_PRIORITY_DISPLAY, INDEX_WINDOW); mAnimationThread = AnimationThread.get(); mAnimationThreadId = AnimationThread.get().getThreadId(); } @Override Loading @@ -45,7 +52,7 @@ class WindowManagerThreadPriorityBooster extends ThreadPriorityBooster { // Do not boost the animation thread. As the animation thread is changing priorities, // boosting it might mess up the priority because we reset it the the previous priority. if (myTid() == mAnimationThread.getThreadId()) { if (myTid() == mAnimationThreadId) { return; } super.boost(); Loading @@ -55,24 +62,35 @@ class WindowManagerThreadPriorityBooster extends ThreadPriorityBooster { public void reset() { // See comment in boost(). if (myTid() == mAnimationThread.getThreadId()) { if (myTid() == mAnimationThreadId) { return; } super.reset(); } void setAppTransitionRunning(boolean running) { if (mAppTransitionRunning == running) { return; synchronized (mLock) { if (mAppTransitionRunning != running) { mAppTransitionRunning = running; updatePriorityLocked(); } } } final int priority = calculatePriority(running); setBoostToPriority(priority); setThreadPriority(mAnimationThread.getThreadId(), priority); mAppTransitionRunning = running; void setBoundsAnimationRunning(boolean running) { synchronized (mLock) { if (mBoundsAnimationRunning != running) { mBoundsAnimationRunning = running; updatePriorityLocked(); } } } private int calculatePriority(boolean appTransitionRunning) { return appTransitionRunning ? TOP_APP_PRIORITY_BOOST : THREAD_PRIORITY_DISPLAY; @GuardedBy("mLock") private void updatePriorityLocked() { int priority = (mAppTransitionRunning || mBoundsAnimationRunning) ? TOP_APP_PRIORITY_BOOST : THREAD_PRIORITY_DISPLAY; setBoostToPriority(priority); setThreadPriority(mAnimationThreadId, priority); } }