diff options
| author | 2020-01-17 11:50:31 -0800 | |
|---|---|---|
| committer | 2020-01-17 11:50:31 -0800 | |
| commit | c57c1c3356c1f202df3454b23f1d011b3d20c3a0 (patch) | |
| tree | 2fca41381ff84ab6ff21269edec72dc7c11ba2ad | |
| parent | 0186924384f75f868e978ddc263aee99b5663cb2 (diff) | |
| parent | d8ef11699304a2fdffbbe1be77f885042a840e00 (diff) | |
Improved timekeeping logic for USAP Pool refill mechanism.
am: d8ef116993
Change-Id: I4754866a6740ec7dbe0ae46d4b2c463416f08155
| -rw-r--r-- | core/java/com/android/internal/os/ZygoteServer.java | 13 |
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); } } |