summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chris Wailes <chriswailes@google.com> 2020-01-17 11:50:31 -0800
committer android-build-merger <android-build-merger@google.com> 2020-01-17 11:50:31 -0800
commitc57c1c3356c1f202df3454b23f1d011b3d20c3a0 (patch)
tree2fca41381ff84ab6ff21269edec72dc7c11ba2ad
parent0186924384f75f868e978ddc263aee99b5663cb2 (diff)
parentd8ef11699304a2fdffbbe1be77f885042a840e00 (diff)
Improved timekeeping logic for USAP Pool refill mechanism.
am: d8ef116993 Change-Id: I4754866a6740ec7dbe0ae46d4b2c463416f08155
-rw-r--r--core/java/com/android/internal/os/ZygoteServer.java13
1 files changed, 10 insertions, 3 deletions
diff --git a/core/java/com/android/internal/os/ZygoteServer.java b/core/java/com/android/internal/os/ZygoteServer.java
index 34ea28172cc7..4a21d37a38fb 100644
--- a/core/java/com/android/internal/os/ZygoteServer.java
+++ b/core/java/com/android/internal/os/ZygoteServer.java
@@ -490,16 +490,23 @@ class ZygoteServer {
if (mUsapPoolRefillTriggerTimestamp == INVALID_TIMESTAMP) {
pollTimeoutMs = -1;
} else {
- int elapsedTimeMs =
- (int) (System.currentTimeMillis() - mUsapPoolRefillTriggerTimestamp);
+ long elapsedTimeMs = System.currentTimeMillis() - mUsapPoolRefillTriggerTimestamp;
if (elapsedTimeMs >= mUsapPoolRefillDelayMs) {
// Normalize the poll timeout value when the time between one poll event and the
// next pushes us over the delay value. This prevents poll receiving a 0
// timeout value, which would result in it returning immediately.
pollTimeoutMs = -1;
+
+ } else if (elapsedTimeMs <= 0) {
+ // This can occur if the clock used by currentTimeMillis is reset, which is
+ // possible because it is not guaranteed to be monotonic. Because we can't tell
+ // how far back the clock was set the best way to recover is to simply re-start
+ // the respawn delay countdown.
+ pollTimeoutMs = mUsapPoolRefillDelayMs;
+
} else {
- pollTimeoutMs = mUsapPoolRefillDelayMs - elapsedTimeMs;
+ pollTimeoutMs = (int) (mUsapPoolRefillDelayMs - elapsedTimeMs);
}
}