1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17 package com.android.server.wm; 18 19 import static android.os.Process.THREAD_PRIORITY_DISPLAY; 20 import static android.os.Process.myTid; 21 import static android.os.Process.setThreadPriority; 22 23 import static com.android.server.LockGuard.INDEX_WINDOW; 24 import static com.android.server.am.ActivityManagerService.TOP_APP_PRIORITY_BOOST; 25 26 import com.android.internal.annotations.GuardedBy; 27 import com.android.server.AnimationThread; 28 import com.android.server.ThreadPriorityBooster; 29 30 /** 31 * Window manager version of {@link ThreadPriorityBooster} that boosts even more during app 32 * transitions. 33 */ 34 class WindowManagerThreadPriorityBooster extends ThreadPriorityBooster { 35 36 private final Object mLock = new Object(); 37 38 private final int mAnimationThreadId; 39 40 @GuardedBy("mLock") 41 private boolean mAppTransitionRunning; 42 @GuardedBy("mLock") 43 private boolean mBoundsAnimationRunning; 44 WindowManagerThreadPriorityBooster()45 WindowManagerThreadPriorityBooster() { 46 super(THREAD_PRIORITY_DISPLAY, INDEX_WINDOW); 47 mAnimationThreadId = AnimationThread.get().getThreadId(); 48 } 49 50 @Override boost()51 public void boost() { 52 53 // Do not boost the animation thread. As the animation thread is changing priorities, 54 // boosting it might mess up the priority because we reset it the the previous priority. 55 if (myTid() == mAnimationThreadId) { 56 return; 57 } 58 super.boost(); 59 } 60 61 @Override reset()62 public void reset() { 63 64 // See comment in boost(). 65 if (myTid() == mAnimationThreadId) { 66 return; 67 } 68 super.reset(); 69 } 70 setAppTransitionRunning(boolean running)71 void setAppTransitionRunning(boolean running) { 72 synchronized (mLock) { 73 if (mAppTransitionRunning != running) { 74 mAppTransitionRunning = running; 75 updatePriorityLocked(); 76 } 77 } 78 } 79 setBoundsAnimationRunning(boolean running)80 void setBoundsAnimationRunning(boolean running) { 81 synchronized (mLock) { 82 if (mBoundsAnimationRunning != running) { 83 mBoundsAnimationRunning = running; 84 updatePriorityLocked(); 85 } 86 } 87 } 88 89 @GuardedBy("mLock") updatePriorityLocked()90 private void updatePriorityLocked() { 91 int priority = (mAppTransitionRunning || mBoundsAnimationRunning) 92 ? TOP_APP_PRIORITY_BOOST : THREAD_PRIORITY_DISPLAY; 93 setBoostToPriority(priority); 94 setThreadPriority(mAnimationThreadId, priority); 95 } 96 } 97