From a8e06f0064a3b0a827eee2776a85432c3b12075e Mon Sep 17 00:00:00 2001 From: Yu-Ting Tseng Date: Thu, 2 Mar 2023 14:20:11 -0800 Subject: [PATCH] Fix a memory leak in UidState. Test: atest ProcessStatsTest Bug: 271320793 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:1635233cd4eabd0225769f37e737b770388bf340) Merged-In: I22e0e266a346f24c7ca0a95bf450320c8b68cbb1 Change-Id: I22e0e266a346f24c7ca0a95bf450320c8b68cbb1 --- .../android/internal/app/procstats/UidState.java | 1 + .../internal/app/procstats/ProcessStatsTest.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/core/java/com/android/internal/app/procstats/UidState.java b/core/java/com/android/internal/app/procstats/UidState.java index 8761b7470cd33..49113465c26af 100644 --- a/core/java/com/android/internal/app/procstats/UidState.java +++ b/core/java/com/android/internal/app/procstats/UidState.java @@ -150,6 +150,7 @@ public final class UidState { public void resetSafely(long now) { mDurations.resetTable(); mStartTime = now; + mProcesses.removeIf(p -> !p.isInUse()); } /** diff --git a/core/tests/coretests/src/com/android/internal/app/procstats/ProcessStatsTest.java b/core/tests/coretests/src/com/android/internal/app/procstats/ProcessStatsTest.java index d4276efe39c2c..61899143b9c5e 100644 --- a/core/tests/coretests/src/com/android/internal/app/procstats/ProcessStatsTest.java +++ b/core/tests/coretests/src/com/android/internal/app/procstats/ProcessStatsTest.java @@ -186,4 +186,19 @@ public class ProcessStatsTest extends TestCase { eq(0), eq(APP_1_PROCESS_NAME)); } + + @SmallTest + public void testSafelyResetClearsProcessInUidState() throws Exception { + ProcessStats processStats = new ProcessStats(); + ProcessState processState = + processStats.getProcessStateLocked( + APP_1_PACKAGE_NAME, APP_1_UID, APP_1_VERSION, APP_1_PROCESS_NAME); + processState.makeActive(); + UidState uidState = processStats.mUidStates.get(APP_1_UID); + assertTrue(uidState.isInUse()); + processState.makeInactive(); + uidState.resetSafely(NOW_MS); + processState.makeActive(); + assertFalse(uidState.isInUse()); + } }