summaryrefslogtreecommitdiffstats
path: root/services/core/java/com/android/server/Watchdog.java
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2014-08-24 16:45:38 -0700
committerDianne Hackborn <hackbod@google.com>2014-08-26 11:16:59 -0700
commit89ad456ea49cb62615ebdcac83a2515743bbe5fa (patch)
tree4fdd6b948f74930ad10beca0a042e40f36efc50c /services/core/java/com/android/server/Watchdog.java
parent1ce1ba68acbfcbd4100d8c4be7d17a1f0623fd62 (diff)
downloadframeworks_base-89ad456ea49cb62615ebdcac83a2515743bbe5fa.zip
frameworks_base-89ad456ea49cb62615ebdcac83a2515743bbe5fa.tar.gz
frameworks_base-89ad456ea49cb62615ebdcac83a2515743bbe5fa.tar.bz2
Fix issue #16311398: Limit number of documents a process can open
In application processes, monitor for when we start getting close to the Dalvik heap limit, and ask the activity manager to try to prune old activity instances in that case. Add an explicit API for apps to ask that they have their own activity instances cleaned up, if they want. Fix some bugs in launching activities that were not correctly applying the "multi task" behavior in the appropriate situations of document-centric recents. Clean up the activity manager's process removal code to all share a common path. Add a new "Spam" option to ActivityTests, which continually creates new tasks, checking that the activity manager will now prune old tasks rather than letting the app run out of RAM. And while I was was doing this, I found problems with the path for bringing an empty task to the foreground -- it could make a new task instead of re-starting the root activity in the existing task. This is fixed, and some code in the recents UI for working around the bug is removed. And as long as I am doing that, we now have nice hooks in to the activity manager for AppTask to give some APIs for better managing the task, so add those along with more tests for these APIs in ActivityTests. We should look at also having the activity manager try to prune old tasks when it sees app processes being killed, to better balance memory use across multiple processes when some processes may host many documents. That however is for another CL... Change-Id: I2bb81c3f92819350c868c7a7470b35817eb9bea9
Diffstat (limited to 'services/core/java/com/android/server/Watchdog.java')
-rw-r--r--services/core/java/com/android/server/Watchdog.java16
1 files changed, 16 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java
index 1ce073a..89e3f49 100644
--- a/services/core/java/com/android/server/Watchdog.java
+++ b/services/core/java/com/android/server/Watchdog.java
@@ -332,6 +332,7 @@ public class Watchdog extends Thread {
final ArrayList<HandlerChecker> blockedCheckers;
final String subject;
final boolean allowRestart;
+ int debuggerWasConnected = 0;
synchronized (this) {
long timeout = CHECK_INTERVAL;
// Make sure we (re)spin the checkers that have become idle within
@@ -341,17 +342,27 @@ public class Watchdog extends Thread {
hc.scheduleCheckLocked();
}
+ if (debuggerWasConnected > 0) {
+ debuggerWasConnected--;
+ }
+
// NOTE: We use uptimeMillis() here because we do not want to increment the time we
// wait while asleep. If the device is asleep then the thing that we are waiting
// to timeout on is asleep as well and won't have a chance to run, causing a false
// positive on when to kill things.
long start = SystemClock.uptimeMillis();
while (timeout > 0) {
+ if (Debug.isDebuggerConnected()) {
+ debuggerWasConnected = 2;
+ }
try {
wait(timeout);
} catch (InterruptedException e) {
Log.wtf(TAG, e);
}
+ if (Debug.isDebuggerConnected()) {
+ debuggerWasConnected = 2;
+ }
timeout = CHECK_INTERVAL - (SystemClock.uptimeMillis() - start);
}
@@ -450,7 +461,12 @@ public class Watchdog extends Thread {
// Only kill the process if the debugger is not attached.
if (Debug.isDebuggerConnected()) {
+ debuggerWasConnected = 2;
+ }
+ if (debuggerWasConnected >= 2) {
Slog.w(TAG, "Debugger connected: Watchdog is *not* killing the system process");
+ } else if (debuggerWasConnected > 0) {
+ Slog.w(TAG, "Debugger was connected: Watchdog is *not* killing the system process");
} else if (!allowRestart) {
Slog.w(TAG, "Restart not allowed: Watchdog is *not* killing the system process");
} else {