From fbc260728d1f925fb1d392adc5cc83057bb4bdf9 Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Wed, 7 Dec 2022 09:48:28 -0800 Subject: [PATCH] Fix race in short FGS timeout Bug: 257270313 Test: atest CtsShortFgsTestCases Test: atest CtsShortFgsTestCases:android.app.cts.shortfgstest.ActivityManagerShortFgsTest#testTimeout --rerun-until-failure 20 Change-Id: I7dfa3e5c4854eaa578e6a7899078b0d09feb40c3 --- .../core/java/com/android/server/am/ActiveServices.java | 6 ++++++ services/core/java/com/android/server/am/ServiceRecord.java | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 0d672bd8b21e4..e47bd449cceee 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -2981,6 +2981,9 @@ public final class ActiveServices { void onShortFgsTimeout(ServiceRecord sr) { synchronized (mAm) { if (!sr.shouldTriggerShortFgsTimeout()) { + if (DEBUG_SHORT_SERVICE) { + Slog.d(TAG_SERVICE, "[STALE] Short FGS timed out: " + sr); + } return; } Slog.e(TAG_SERVICE, "Short FGS timed out: " + sr); @@ -3021,6 +3024,9 @@ public final class ActiveServices { tr.mLatencyTracker.waitingOnAMSLockEnded(); if (!sr.shouldTriggerShortFgsAnr()) { + if (DEBUG_SHORT_SERVICE) { + Slog.d(TAG_SERVICE, "[STALE] Short FGS ANR'ed: " + sr); + } return; } diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java index ef195aa13354b..8ac10b85f6344 100644 --- a/services/core/java/com/android/server/am/ServiceRecord.java +++ b/services/core/java/com/android/server/am/ServiceRecord.java @@ -1416,7 +1416,7 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN || !mShortFgsInfo.isCurrent()) { return false; } - return mShortFgsInfo.getTimeoutTime() < SystemClock.uptimeMillis(); + return mShortFgsInfo.getTimeoutTime() <= SystemClock.uptimeMillis(); } /** @@ -1431,7 +1431,7 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN || !mShortFgsInfo.isCurrent()) { return false; } - return mShortFgsInfo.getAnrTime() < SystemClock.uptimeMillis(); + return mShortFgsInfo.getAnrTime() <= SystemClock.uptimeMillis(); } private boolean isAppAlive() {