Merge "Scheduling fix for JobScheduler"
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index 4d7df9c..309bec8 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -88,6 +88,7 @@
static final int MSG_JOB_EXPIRED = 0;
static final int MSG_CHECK_JOB = 1;
static final int MSG_STOP_JOB = 2;
+ static final int MSG_CHECK_JOB_GREEDY = 3;
// Policy constants
/**
@@ -362,7 +363,8 @@
}
void reportActive() {
- boolean active = false;
+ // active is true if pending queue contains jobs OR some job is running.
+ boolean active = mPendingJobs.size() > 0;
if (mPendingJobs.size() <= 0) {
for (int i=0; i<mActiveServices.size(); i++) {
JobServiceContext jsc = mActiveServices.get(i);
@@ -372,9 +374,10 @@
}
}
}
- if (mLocalDeviceIdleController != null) {
- if (mReportedActive != active) {
- mReportedActive = active;
+
+ if (mReportedActive != active) {
+ mReportedActive = active;
+ if (mLocalDeviceIdleController != null) {
mLocalDeviceIdleController.setJobsActive(active);
}
}
@@ -628,7 +631,8 @@
JobStatus rescheduledPeriodic = getRescheduleJobForPeriodic(jobStatus);
startTrackingJob(rescheduledPeriodic);
}
- mHandler.obtainMessage(MSG_CHECK_JOB).sendToTarget();
+ reportActive();
+ mHandler.obtainMessage(MSG_CHECK_JOB_GREEDY).sendToTarget();
}
// StateChangedListener implementations.
@@ -676,8 +680,18 @@
break;
case MSG_CHECK_JOB:
synchronized (mJobs) {
- // Check the list of jobs and run some of them if we feel inclined.
- maybeQueueReadyJobsForExecutionLockedH();
+ if (mReportedActive) {
+ // if jobs are currently being run, queue all ready jobs for execution.
+ queueReadyJobsForExecutionLockedH();
+ } else {
+ // Check the list of jobs and run some of them if we feel inclined.
+ maybeQueueReadyJobsForExecutionLockedH();
+ }
+ }
+ break;
+ case MSG_CHECK_JOB_GREEDY:
+ synchronized (mJobs) {
+ queueReadyJobsForExecutionLockedH();
}
break;
case MSG_STOP_JOB:
@@ -709,7 +723,6 @@
stopJobOnServiceContextLocked(job);
}
}
- reportActive();
if (DEBUG) {
final int queuedJobs = mPendingJobs.size();
if (queuedJobs == 0) {
@@ -786,7 +799,6 @@
Slog.d(TAG, "maybeQueueReadyJobsForExecutionLockedH: Not running anything.");
}
}
- reportActive();
if (DEBUG) {
Slog.d(TAG, "idle=" + idleCount + " connectivity=" +
connectivityCount + " charging=" + chargingCount + " tot=" +