summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2017-05-12 02:31:14 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-05-12 02:31:19 +0000
commitbb9218778c0092482c483cad0f04daee1011d7b1 (patch)
tree16ce7573a34d5888949e3b5799d54ef6705e3d46
parent69ab8e1d56dddb73296eb2f8659affd94ba9ac1c (diff)
parenta41b729f8f5eae6e7aec59970b77bfb62d5528e5 (diff)
Merge "Reduce impact of RenderThread in system_server" into oc-dev
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java16
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotController.java9
-rw-r--r--services/core/java/com/android/server/wm/TaskSnapshotPersister.java21
-rw-r--r--services/core/java/com/android/server/wm/WindowAnimator.java11
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);
}