diff options
| author | 2017-05-12 02:31:14 +0000 | |
|---|---|---|
| committer | 2017-05-12 02:31:19 +0000 | |
| commit | bb9218778c0092482c483cad0f04daee1011d7b1 (patch) | |
| tree | 16ce7573a34d5888949e3b5799d54ef6705e3d46 | |
| parent | 69ab8e1d56dddb73296eb2f8659affd94ba9ac1c (diff) | |
| parent | a41b729f8f5eae6e7aec59970b77bfb62d5528e5 (diff) | |
Merge "Reduce impact of RenderThread in system_server" into oc-dev
4 files changed, 52 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index e76ffb1b2e10..5283924d590c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -13407,8 +13407,12 @@ public class ActivityManagerService extends IActivityManager.Stub public void setRenderThread(int tid) { synchronized (this) { ProcessRecord proc; + int pid = Binder.getCallingPid(); + if (pid == Process.myPid()) { + demoteSystemServerRenderThread(tid); + return; + } synchronized (mPidsSelfLocked) { - int pid = Binder.getCallingPid(); proc = mPidsSelfLocked.get(pid); if (proc != null && proc.renderThreadTid == 0 && tid > 0) { // ensure the tid belongs to the process @@ -13441,6 +13445,16 @@ public class ActivityManagerService extends IActivityManager.Stub } } + /** + * We only use RenderThread in system_server to store task snapshots to the disk, which should + * happen in the background. Thus, demote render thread from system_server to a lower priority. + * + * @param tid the tid of the RenderThread + */ + private void demoteSystemServerRenderThread(int tid) { + setThreadPriority(tid, Process.THREAD_PRIORITY_BACKGROUND); + } + @Override public int setVrMode(IBinder token, boolean enabled, ComponentName packageName) { if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_VR_MODE)) { diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index b79173cf77e5..1bbe1d0c9a93 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -275,6 +275,15 @@ class TaskSnapshotController { mPersister.removeObsoleteFiles(persistentTaskIds, runningUserIds); } + /** + * Temporarily pauses/unpauses persisting of task snapshots. + * + * @param paused Whether task snapshot persisting should be paused. + */ + void setPersisterPaused(boolean paused) { + mPersister.setPaused(paused); + } + void dump(PrintWriter pw, String prefix) { mCache.dump(pw, prefix); } diff --git a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java index e5c7a72c78bc..028707004773 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java @@ -60,6 +60,8 @@ class TaskSnapshotPersister { private final ArrayDeque<WriteQueueItem> mWriteQueue = new ArrayDeque<>(); @GuardedBy("mLock") private boolean mQueueIdling; + @GuardedBy("mLock") + private boolean mPaused; private boolean mStarted; private final Object mLock = new Object(); private final DirectoryResolver mDirectoryResolver; @@ -127,6 +129,15 @@ class TaskSnapshotPersister { } } + void setPaused(boolean paused) { + synchronized (mLock) { + mPaused = paused; + if (!paused) { + mLock.notifyAll(); + } + } + } + @TestApi void waitForQueueEmpty() { while (true) { @@ -142,7 +153,9 @@ class TaskSnapshotPersister { @GuardedBy("mLock") private void sendToQueueLocked(WriteQueueItem item) { mWriteQueue.offer(item); - mLock.notifyAll(); + if (!mPaused) { + mLock.notifyAll(); + } } private File getDirectory(int userId) { @@ -185,7 +198,11 @@ class TaskSnapshotPersister { while (true) { WriteQueueItem next; synchronized (mLock) { - next = mWriteQueue.poll(); + if (mPaused) { + next = null; + } else { + next = mWriteQueue.poll(); + } } if (next != null) { next.write(); diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 067cc0905bd3..dd790a92323e 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -255,12 +255,19 @@ public class WindowAnimator { mWindowPlacerLocked.requestTraversal(); } - if (mAnimating && !wasAnimating && Trace.isTagEnabled(Trace.TRACE_TAG_WINDOW_MANAGER)) { - Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "animating", 0); + if (mAnimating && !wasAnimating) { + + // Usually app transitions but quite a load onto the system already (with all the things + // happening in app), so pause task snapshot persisting to not increase the load. + mService.mTaskSnapshotController.setPersisterPaused(true); + if (Trace.isTagEnabled(Trace.TRACE_TAG_WINDOW_MANAGER)) { + Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "animating", 0); + } } if (!mAnimating && wasAnimating) { mWindowPlacerLocked.requestTraversal(); + mService.mTaskSnapshotController.setPersisterPaused(false); if (Trace.isTagEnabled(Trace.TRACE_TAG_WINDOW_MANAGER)) { Trace.asyncTraceEnd(Trace.TRACE_TAG_WINDOW_MANAGER, "animating", 0); } |