Loading apex/jobscheduler/service/java/com/android/server/job/restrictions/ThermalStatusRestriction.java +17 −6 Original line number Diff line number Diff line Loading @@ -91,12 +91,23 @@ public class ThermalStatusRestriction extends JobRestriction { } final int priority = job.getEffectivePriority(); if (mThermalStatus >= HIGHER_PRIORITY_THRESHOLD) { // For moderate throttling, only let expedited jobs and high priority regular jobs that // haven't been running for a long time run. return !job.shouldTreatAsExpeditedJob() && !(priority == JobInfo.PRIORITY_HIGH && mService.isCurrentlyRunningLocked(job) && !mService.isJobInOvertimeLocked(job)); // For moderate throttling: // Only let expedited & user-initiated jobs run if: // 1. They haven't previously run // 2. They're already running and aren't yet in overtime // Only let high priority jobs run if: // They are already running and aren't yet in overtime // Don't let any other job run. if (job.shouldTreatAsExpeditedJob() || job.shouldTreatAsUserInitiated()) { return job.getNumPreviousAttempts() > 0 || (mService.isCurrentlyRunningLocked(job) && mService.isJobInOvertimeLocked(job)); } if (priority == JobInfo.PRIORITY_HIGH) { return !mService.isCurrentlyRunningLocked(job) || mService.isJobInOvertimeLocked(job); } return true; } if (mThermalStatus >= LOW_PRIORITY_THRESHOLD) { // For light throttling, throttle all min priority jobs and all low priority jobs that Loading services/tests/mockingservicestests/src/com/android/server/job/restrictions/ThermalStatusRestrictionTest.java +68 −0 Original line number Diff line number Diff line Loading @@ -180,14 +180,47 @@ public class ThermalStatusRestrictionTest { createJobBuilder(7).setExpedited(true).build()); final JobStatus ej = spy(createJobStatus("testIsJobRestricted", createJobBuilder(8).setExpedited(true).build())); final JobStatus ejRetried = spy(createJobStatus("testIsJobRestricted", createJobBuilder(11).setExpedited(true).build())); final JobStatus ejRunning = spy(createJobStatus("testIsJobRestricted", createJobBuilder(12).setExpedited(true).build())); final JobStatus ejRunningLong = spy(createJobStatus("testIsJobRestricted", createJobBuilder(13).setExpedited(true).build())); final JobStatus ui = spy(createJobStatus("testIsJobRestricted", createJobBuilder(14).build())); final JobStatus uiRetried = spy(createJobStatus("testIsJobRestricted", createJobBuilder(15).build())); final JobStatus uiRunning = spy(createJobStatus("testIsJobRestricted", createJobBuilder(16).build())); final JobStatus uiRunningLong = spy(createJobStatus("testIsJobRestricted", createJobBuilder(17).build())); when(ej.shouldTreatAsExpeditedJob()).thenReturn(true); when(ejRetried.shouldTreatAsExpeditedJob()).thenReturn(true); when(ejRunning.shouldTreatAsExpeditedJob()).thenReturn(true); when(ejRunningLong.shouldTreatAsExpeditedJob()).thenReturn(true); when(ui.shouldTreatAsUserInitiated()).thenReturn(true); when(uiRetried.shouldTreatAsUserInitiated()).thenReturn(true); when(uiRunning.shouldTreatAsUserInitiated()).thenReturn(true); when(uiRunningLong.shouldTreatAsUserInitiated()).thenReturn(true); when(ejRetried.getNumPreviousAttempts()).thenReturn(1); when(uiRetried.getNumPreviousAttempts()).thenReturn(2); when(mJobSchedulerService.isCurrentlyRunningLocked(jobLowPriorityRunning)).thenReturn(true); when(mJobSchedulerService.isCurrentlyRunningLocked(jobHighPriorityRunning)) .thenReturn(true); when(mJobSchedulerService.isCurrentlyRunningLocked(jobLowPriorityRunningLong)) .thenReturn(true); when(mJobSchedulerService.isCurrentlyRunningLocked(jobHighPriorityRunningLong)) .thenReturn(true); when(mJobSchedulerService.isCurrentlyRunningLocked(ejRunning)).thenReturn(true); when(mJobSchedulerService.isCurrentlyRunningLocked(ejRunningLong)).thenReturn(true); when(mJobSchedulerService.isCurrentlyRunningLocked(uiRunning)).thenReturn(true); when(mJobSchedulerService.isCurrentlyRunningLocked(uiRunningLong)).thenReturn(true); when(mJobSchedulerService.isJobInOvertimeLocked(jobLowPriorityRunningLong)) .thenReturn(true); when(mJobSchedulerService.isJobInOvertimeLocked(jobHighPriorityRunningLong)) .thenReturn(true); when(mJobSchedulerService.isJobInOvertimeLocked(ejRunningLong)).thenReturn(true); when(mJobSchedulerService.isJobInOvertimeLocked(uiRunningLong)).thenReturn(true); assertFalse(mThermalStatusRestriction.isJobRestricted(jobMinPriority)); assertFalse(mThermalStatusRestriction.isJobRestricted(jobLowPriority)); Loading @@ -199,6 +232,13 @@ public class ThermalStatusRestrictionTest { assertFalse(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong)); assertFalse(mThermalStatusRestriction.isJobRestricted(ej)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejDowngraded)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejRetried)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunning)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunningLong)); assertFalse(mThermalStatusRestriction.isJobRestricted(ui)); assertFalse(mThermalStatusRestriction.isJobRestricted(uiRetried)); assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunning)); assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunningLong)); mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_LIGHT); Loading @@ -212,6 +252,13 @@ public class ThermalStatusRestrictionTest { assertFalse(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejDowngraded)); assertFalse(mThermalStatusRestriction.isJobRestricted(ej)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejRetried)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunning)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunningLong)); assertFalse(mThermalStatusRestriction.isJobRestricted(ui)); assertFalse(mThermalStatusRestriction.isJobRestricted(uiRetried)); assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunning)); assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunningLong)); mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_MODERATE); Loading @@ -225,6 +272,13 @@ public class ThermalStatusRestrictionTest { assertTrue(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejDowngraded)); assertFalse(mThermalStatusRestriction.isJobRestricted(ej)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRetried)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunning)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunningLong)); assertFalse(mThermalStatusRestriction.isJobRestricted(ui)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRetried)); assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunning)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunningLong)); mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_SEVERE); Loading @@ -238,6 +292,13 @@ public class ThermalStatusRestrictionTest { assertTrue(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejDowngraded)); assertTrue(mThermalStatusRestriction.isJobRestricted(ej)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRetried)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunning)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunningLong)); assertTrue(mThermalStatusRestriction.isJobRestricted(ui)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRetried)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunning)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunningLong)); mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_CRITICAL); Loading @@ -251,6 +312,13 @@ public class ThermalStatusRestrictionTest { assertTrue(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejDowngraded)); assertTrue(mThermalStatusRestriction.isJobRestricted(ej)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRetried)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunning)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunningLong)); assertTrue(mThermalStatusRestriction.isJobRestricted(ui)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRetried)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunning)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunningLong)); } private JobInfo.Builder createJobBuilder(int jobId) { Loading Loading
apex/jobscheduler/service/java/com/android/server/job/restrictions/ThermalStatusRestriction.java +17 −6 Original line number Diff line number Diff line Loading @@ -91,12 +91,23 @@ public class ThermalStatusRestriction extends JobRestriction { } final int priority = job.getEffectivePriority(); if (mThermalStatus >= HIGHER_PRIORITY_THRESHOLD) { // For moderate throttling, only let expedited jobs and high priority regular jobs that // haven't been running for a long time run. return !job.shouldTreatAsExpeditedJob() && !(priority == JobInfo.PRIORITY_HIGH && mService.isCurrentlyRunningLocked(job) && !mService.isJobInOvertimeLocked(job)); // For moderate throttling: // Only let expedited & user-initiated jobs run if: // 1. They haven't previously run // 2. They're already running and aren't yet in overtime // Only let high priority jobs run if: // They are already running and aren't yet in overtime // Don't let any other job run. if (job.shouldTreatAsExpeditedJob() || job.shouldTreatAsUserInitiated()) { return job.getNumPreviousAttempts() > 0 || (mService.isCurrentlyRunningLocked(job) && mService.isJobInOvertimeLocked(job)); } if (priority == JobInfo.PRIORITY_HIGH) { return !mService.isCurrentlyRunningLocked(job) || mService.isJobInOvertimeLocked(job); } return true; } if (mThermalStatus >= LOW_PRIORITY_THRESHOLD) { // For light throttling, throttle all min priority jobs and all low priority jobs that Loading
services/tests/mockingservicestests/src/com/android/server/job/restrictions/ThermalStatusRestrictionTest.java +68 −0 Original line number Diff line number Diff line Loading @@ -180,14 +180,47 @@ public class ThermalStatusRestrictionTest { createJobBuilder(7).setExpedited(true).build()); final JobStatus ej = spy(createJobStatus("testIsJobRestricted", createJobBuilder(8).setExpedited(true).build())); final JobStatus ejRetried = spy(createJobStatus("testIsJobRestricted", createJobBuilder(11).setExpedited(true).build())); final JobStatus ejRunning = spy(createJobStatus("testIsJobRestricted", createJobBuilder(12).setExpedited(true).build())); final JobStatus ejRunningLong = spy(createJobStatus("testIsJobRestricted", createJobBuilder(13).setExpedited(true).build())); final JobStatus ui = spy(createJobStatus("testIsJobRestricted", createJobBuilder(14).build())); final JobStatus uiRetried = spy(createJobStatus("testIsJobRestricted", createJobBuilder(15).build())); final JobStatus uiRunning = spy(createJobStatus("testIsJobRestricted", createJobBuilder(16).build())); final JobStatus uiRunningLong = spy(createJobStatus("testIsJobRestricted", createJobBuilder(17).build())); when(ej.shouldTreatAsExpeditedJob()).thenReturn(true); when(ejRetried.shouldTreatAsExpeditedJob()).thenReturn(true); when(ejRunning.shouldTreatAsExpeditedJob()).thenReturn(true); when(ejRunningLong.shouldTreatAsExpeditedJob()).thenReturn(true); when(ui.shouldTreatAsUserInitiated()).thenReturn(true); when(uiRetried.shouldTreatAsUserInitiated()).thenReturn(true); when(uiRunning.shouldTreatAsUserInitiated()).thenReturn(true); when(uiRunningLong.shouldTreatAsUserInitiated()).thenReturn(true); when(ejRetried.getNumPreviousAttempts()).thenReturn(1); when(uiRetried.getNumPreviousAttempts()).thenReturn(2); when(mJobSchedulerService.isCurrentlyRunningLocked(jobLowPriorityRunning)).thenReturn(true); when(mJobSchedulerService.isCurrentlyRunningLocked(jobHighPriorityRunning)) .thenReturn(true); when(mJobSchedulerService.isCurrentlyRunningLocked(jobLowPriorityRunningLong)) .thenReturn(true); when(mJobSchedulerService.isCurrentlyRunningLocked(jobHighPriorityRunningLong)) .thenReturn(true); when(mJobSchedulerService.isCurrentlyRunningLocked(ejRunning)).thenReturn(true); when(mJobSchedulerService.isCurrentlyRunningLocked(ejRunningLong)).thenReturn(true); when(mJobSchedulerService.isCurrentlyRunningLocked(uiRunning)).thenReturn(true); when(mJobSchedulerService.isCurrentlyRunningLocked(uiRunningLong)).thenReturn(true); when(mJobSchedulerService.isJobInOvertimeLocked(jobLowPriorityRunningLong)) .thenReturn(true); when(mJobSchedulerService.isJobInOvertimeLocked(jobHighPriorityRunningLong)) .thenReturn(true); when(mJobSchedulerService.isJobInOvertimeLocked(ejRunningLong)).thenReturn(true); when(mJobSchedulerService.isJobInOvertimeLocked(uiRunningLong)).thenReturn(true); assertFalse(mThermalStatusRestriction.isJobRestricted(jobMinPriority)); assertFalse(mThermalStatusRestriction.isJobRestricted(jobLowPriority)); Loading @@ -199,6 +232,13 @@ public class ThermalStatusRestrictionTest { assertFalse(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong)); assertFalse(mThermalStatusRestriction.isJobRestricted(ej)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejDowngraded)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejRetried)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunning)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunningLong)); assertFalse(mThermalStatusRestriction.isJobRestricted(ui)); assertFalse(mThermalStatusRestriction.isJobRestricted(uiRetried)); assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunning)); assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunningLong)); mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_LIGHT); Loading @@ -212,6 +252,13 @@ public class ThermalStatusRestrictionTest { assertFalse(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejDowngraded)); assertFalse(mThermalStatusRestriction.isJobRestricted(ej)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejRetried)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunning)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunningLong)); assertFalse(mThermalStatusRestriction.isJobRestricted(ui)); assertFalse(mThermalStatusRestriction.isJobRestricted(uiRetried)); assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunning)); assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunningLong)); mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_MODERATE); Loading @@ -225,6 +272,13 @@ public class ThermalStatusRestrictionTest { assertTrue(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejDowngraded)); assertFalse(mThermalStatusRestriction.isJobRestricted(ej)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRetried)); assertFalse(mThermalStatusRestriction.isJobRestricted(ejRunning)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunningLong)); assertFalse(mThermalStatusRestriction.isJobRestricted(ui)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRetried)); assertFalse(mThermalStatusRestriction.isJobRestricted(uiRunning)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunningLong)); mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_SEVERE); Loading @@ -238,6 +292,13 @@ public class ThermalStatusRestrictionTest { assertTrue(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejDowngraded)); assertTrue(mThermalStatusRestriction.isJobRestricted(ej)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRetried)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunning)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunningLong)); assertTrue(mThermalStatusRestriction.isJobRestricted(ui)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRetried)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunning)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunningLong)); mStatusChangedListener.onThermalStatusChanged(THERMAL_STATUS_CRITICAL); Loading @@ -251,6 +312,13 @@ public class ThermalStatusRestrictionTest { assertTrue(mThermalStatusRestriction.isJobRestricted(jobHighPriorityRunningLong)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejDowngraded)); assertTrue(mThermalStatusRestriction.isJobRestricted(ej)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRetried)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunning)); assertTrue(mThermalStatusRestriction.isJobRestricted(ejRunningLong)); assertTrue(mThermalStatusRestriction.isJobRestricted(ui)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRetried)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunning)); assertTrue(mThermalStatusRestriction.isJobRestricted(uiRunningLong)); } private JobInfo.Builder createJobBuilder(int jobId) { Loading