Loading apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +3 −1 Original line number Diff line number Diff line Loading @@ -3139,7 +3139,9 @@ public class JobSchedulerService extends com.android.server.SystemService } void resetExecutionQuota(@NonNull String pkgName, int userId) { mQuotaController.clearAppStats(userId, pkgName); synchronized (mLock) { mQuotaController.clearAppStatsLocked(userId, pkgName); } } void resetScheduleQuota() { Loading apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java +8 −7 Original line number Diff line number Diff line Loading @@ -576,7 +576,7 @@ public final class QuotaController extends StateController { Slog.wtf(TAG, "Told app removed but given null package name."); return; } clearAppStats(UserHandle.getUserId(uid), packageName); clearAppStatsLocked(UserHandle.getUserId(uid), packageName); mForegroundUids.delete(uid); mUidToPackageCache.remove(uid); } Loading @@ -592,7 +592,7 @@ public final class QuotaController extends StateController { } /** Drop all historical stats and stop tracking any active sessions for the specified app. */ public void clearAppStats(int userId, @NonNull String packageName) { public void clearAppStatsLocked(int userId, @NonNull String packageName) { mTrackedJobs.delete(userId, packageName); Timer timer = mPkgTimers.get(userId, packageName); if (timer != null) { Loading Loading @@ -1008,7 +1008,7 @@ public final class QuotaController extends StateController { } @VisibleForTesting void incrementJobCount(final int userId, @NonNull final String packageName, int count) { void incrementJobCountLocked(final int userId, @NonNull final String packageName, int count) { final long now = sElapsedRealtimeClock.millis(); ExecutionStats[] appStats = mExecutionStatsCache.get(userId, packageName); if (appStats == null) { Loading @@ -1029,7 +1029,8 @@ public final class QuotaController extends StateController { } } private void incrementTimingSessionCount(final int userId, @NonNull final String packageName) { private void incrementTimingSessionCountLocked(final int userId, @NonNull final String packageName) { final long now = sElapsedRealtimeClock.millis(); ExecutionStats[] appStats = mExecutionStatsCache.get(userId, packageName); if (appStats == null) { Loading Loading @@ -1481,7 +1482,7 @@ public final class QuotaController extends StateController { mRunningBgJobs.add(jobStatus); if (shouldTrackLocked()) { mBgJobCount++; incrementJobCount(mPkg.userId, mPkg.packageName, 1); incrementJobCountLocked(mPkg.userId, mPkg.packageName, 1); if (mRunningBgJobs.size() == 1) { // Started tracking the first job. mStartTimeElapsed = sElapsedRealtimeClock.millis(); Loading Loading @@ -1534,7 +1535,7 @@ public final class QuotaController extends StateController { // of jobs. // However, cancel the currently scheduled cutoff since it's not currently useful. cancelCutoff(); incrementTimingSessionCount(mPkg.userId, mPkg.packageName); incrementTimingSessionCountLocked(mPkg.userId, mPkg.packageName); } /** Loading Loading @@ -1581,7 +1582,7 @@ public final class QuotaController extends StateController { // repeatedly plugged in and unplugged, or an app changes foreground state // very frequently, the job count for a package may be artificially high. mBgJobCount = mRunningBgJobs.size(); incrementJobCount(mPkg.userId, mPkg.packageName, mBgJobCount); incrementJobCountLocked(mPkg.userId, mPkg.packageName, mBgJobCount); // Starting the timer means that all cached execution stats are now // incorrect. invalidateAllExecutionStatsLocked(mPkg.userId, mPkg.packageName); Loading services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java +6 −5 Original line number Diff line number Diff line Loading @@ -1430,8 +1430,8 @@ public class QuotaControllerTest { createTimingSession(now - (HOUR_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5)); mQuotaController.saveTimingSession(0, "com.android.test", createTimingSession(now - (5 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5)); mQuotaController.incrementJobCount(0, "com.android.test", 5); synchronized (mQuotaController.mLock) { mQuotaController.incrementJobCountLocked(0, "com.android.test", 5); assertTrue(mQuotaController.isWithinQuotaLocked(0, "com.android.test", WORKING_INDEX)); } } Loading @@ -1445,8 +1445,8 @@ public class QuotaControllerTest { createTimingSession(now - (HOUR_IN_MILLIS), 15 * MINUTE_IN_MILLIS, 25)); mQuotaController.saveTimingSession(0, "com.android.test.spam", createTimingSession(now - (5 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, jobCount)); mQuotaController.incrementJobCount(0, "com.android.test.spam", jobCount); synchronized (mQuotaController.mLock) { mQuotaController.incrementJobCountLocked(0, "com.android.test.spam", jobCount); assertFalse(mQuotaController.isWithinQuotaLocked( 0, "com.android.test.spam", WORKING_INDEX)); } Loading @@ -1471,8 +1471,8 @@ public class QuotaControllerTest { createTimingSession(now - (30 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5)); mQuotaController.saveTimingSession(0, "com.android.test", createTimingSession(now - (5 * MINUTE_IN_MILLIS), 4 * MINUTE_IN_MILLIS, 5)); mQuotaController.incrementJobCount(0, "com.android.test", 5); synchronized (mQuotaController.mLock) { mQuotaController.incrementJobCountLocked(0, "com.android.test", 5); assertFalse(mQuotaController.isWithinQuotaLocked(0, "com.android.test", WORKING_INDEX)); } } Loading @@ -1486,8 +1486,8 @@ public class QuotaControllerTest { createTimingSession(now - (HOUR_IN_MILLIS), 15 * MINUTE_IN_MILLIS, 25)); mQuotaController.saveTimingSession(0, "com.android.test", createTimingSession(now - (5 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, jobCount)); mQuotaController.incrementJobCount(0, "com.android.test", jobCount); synchronized (mQuotaController.mLock) { mQuotaController.incrementJobCountLocked(0, "com.android.test", jobCount); assertFalse(mQuotaController.isWithinQuotaLocked(0, "com.android.test", WORKING_INDEX)); } } Loading Loading @@ -1637,9 +1637,10 @@ public class QuotaControllerTest { mQuotaController.saveTimingSession(0, "com.android.test", createTimingSession(now - ((10 - i) * MINUTE_IN_MILLIS), 30 * SECOND_IN_MILLIS, 2)); mQuotaController.incrementJobCount(0, "com.android.test", 2); synchronized (mQuotaController.mLock) { mQuotaController.incrementJobCountLocked(0, "com.android.test", 2); assertEquals("Rare has incorrect quota status with " + (i + 1) + " sessions", i < 2, mQuotaController.isWithinQuotaLocked(0, "com.android.test", RARE_INDEX)); Loading Loading
apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +3 −1 Original line number Diff line number Diff line Loading @@ -3139,7 +3139,9 @@ public class JobSchedulerService extends com.android.server.SystemService } void resetExecutionQuota(@NonNull String pkgName, int userId) { mQuotaController.clearAppStats(userId, pkgName); synchronized (mLock) { mQuotaController.clearAppStatsLocked(userId, pkgName); } } void resetScheduleQuota() { Loading
apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java +8 −7 Original line number Diff line number Diff line Loading @@ -576,7 +576,7 @@ public final class QuotaController extends StateController { Slog.wtf(TAG, "Told app removed but given null package name."); return; } clearAppStats(UserHandle.getUserId(uid), packageName); clearAppStatsLocked(UserHandle.getUserId(uid), packageName); mForegroundUids.delete(uid); mUidToPackageCache.remove(uid); } Loading @@ -592,7 +592,7 @@ public final class QuotaController extends StateController { } /** Drop all historical stats and stop tracking any active sessions for the specified app. */ public void clearAppStats(int userId, @NonNull String packageName) { public void clearAppStatsLocked(int userId, @NonNull String packageName) { mTrackedJobs.delete(userId, packageName); Timer timer = mPkgTimers.get(userId, packageName); if (timer != null) { Loading Loading @@ -1008,7 +1008,7 @@ public final class QuotaController extends StateController { } @VisibleForTesting void incrementJobCount(final int userId, @NonNull final String packageName, int count) { void incrementJobCountLocked(final int userId, @NonNull final String packageName, int count) { final long now = sElapsedRealtimeClock.millis(); ExecutionStats[] appStats = mExecutionStatsCache.get(userId, packageName); if (appStats == null) { Loading @@ -1029,7 +1029,8 @@ public final class QuotaController extends StateController { } } private void incrementTimingSessionCount(final int userId, @NonNull final String packageName) { private void incrementTimingSessionCountLocked(final int userId, @NonNull final String packageName) { final long now = sElapsedRealtimeClock.millis(); ExecutionStats[] appStats = mExecutionStatsCache.get(userId, packageName); if (appStats == null) { Loading Loading @@ -1481,7 +1482,7 @@ public final class QuotaController extends StateController { mRunningBgJobs.add(jobStatus); if (shouldTrackLocked()) { mBgJobCount++; incrementJobCount(mPkg.userId, mPkg.packageName, 1); incrementJobCountLocked(mPkg.userId, mPkg.packageName, 1); if (mRunningBgJobs.size() == 1) { // Started tracking the first job. mStartTimeElapsed = sElapsedRealtimeClock.millis(); Loading Loading @@ -1534,7 +1535,7 @@ public final class QuotaController extends StateController { // of jobs. // However, cancel the currently scheduled cutoff since it's not currently useful. cancelCutoff(); incrementTimingSessionCount(mPkg.userId, mPkg.packageName); incrementTimingSessionCountLocked(mPkg.userId, mPkg.packageName); } /** Loading Loading @@ -1581,7 +1582,7 @@ public final class QuotaController extends StateController { // repeatedly plugged in and unplugged, or an app changes foreground state // very frequently, the job count for a package may be artificially high. mBgJobCount = mRunningBgJobs.size(); incrementJobCount(mPkg.userId, mPkg.packageName, mBgJobCount); incrementJobCountLocked(mPkg.userId, mPkg.packageName, mBgJobCount); // Starting the timer means that all cached execution stats are now // incorrect. invalidateAllExecutionStatsLocked(mPkg.userId, mPkg.packageName); Loading
services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java +6 −5 Original line number Diff line number Diff line Loading @@ -1430,8 +1430,8 @@ public class QuotaControllerTest { createTimingSession(now - (HOUR_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5)); mQuotaController.saveTimingSession(0, "com.android.test", createTimingSession(now - (5 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5)); mQuotaController.incrementJobCount(0, "com.android.test", 5); synchronized (mQuotaController.mLock) { mQuotaController.incrementJobCountLocked(0, "com.android.test", 5); assertTrue(mQuotaController.isWithinQuotaLocked(0, "com.android.test", WORKING_INDEX)); } } Loading @@ -1445,8 +1445,8 @@ public class QuotaControllerTest { createTimingSession(now - (HOUR_IN_MILLIS), 15 * MINUTE_IN_MILLIS, 25)); mQuotaController.saveTimingSession(0, "com.android.test.spam", createTimingSession(now - (5 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, jobCount)); mQuotaController.incrementJobCount(0, "com.android.test.spam", jobCount); synchronized (mQuotaController.mLock) { mQuotaController.incrementJobCountLocked(0, "com.android.test.spam", jobCount); assertFalse(mQuotaController.isWithinQuotaLocked( 0, "com.android.test.spam", WORKING_INDEX)); } Loading @@ -1471,8 +1471,8 @@ public class QuotaControllerTest { createTimingSession(now - (30 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5)); mQuotaController.saveTimingSession(0, "com.android.test", createTimingSession(now - (5 * MINUTE_IN_MILLIS), 4 * MINUTE_IN_MILLIS, 5)); mQuotaController.incrementJobCount(0, "com.android.test", 5); synchronized (mQuotaController.mLock) { mQuotaController.incrementJobCountLocked(0, "com.android.test", 5); assertFalse(mQuotaController.isWithinQuotaLocked(0, "com.android.test", WORKING_INDEX)); } } Loading @@ -1486,8 +1486,8 @@ public class QuotaControllerTest { createTimingSession(now - (HOUR_IN_MILLIS), 15 * MINUTE_IN_MILLIS, 25)); mQuotaController.saveTimingSession(0, "com.android.test", createTimingSession(now - (5 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, jobCount)); mQuotaController.incrementJobCount(0, "com.android.test", jobCount); synchronized (mQuotaController.mLock) { mQuotaController.incrementJobCountLocked(0, "com.android.test", jobCount); assertFalse(mQuotaController.isWithinQuotaLocked(0, "com.android.test", WORKING_INDEX)); } } Loading Loading @@ -1637,9 +1637,10 @@ public class QuotaControllerTest { mQuotaController.saveTimingSession(0, "com.android.test", createTimingSession(now - ((10 - i) * MINUTE_IN_MILLIS), 30 * SECOND_IN_MILLIS, 2)); mQuotaController.incrementJobCount(0, "com.android.test", 2); synchronized (mQuotaController.mLock) { mQuotaController.incrementJobCountLocked(0, "com.android.test", 2); assertEquals("Rare has incorrect quota status with " + (i + 1) + " sessions", i < 2, mQuotaController.isWithinQuotaLocked(0, "com.android.test", RARE_INDEX)); Loading