summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Matthew Williams <mjwilliams@google.com> 2014-06-12 20:51:28 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2014-06-12 03:30:50 +0000
commit78b9654311c9966a1d20efe2ddcb4649886b27e3 (patch)
tree2b0d28f75cbf79e5a054cf6371e2b63fbc5159f7
parent0c447bf3b2ddab9e59759b539125f6f2fe05c367 (diff)
parent49a85b64f7c29a5dfbf27112ff22987b85c59338 (diff)
Merge "JobScheduler blocking main thread." into lmp-preview-dev
-rw-r--r--services/core/java/com/android/server/job/JobServiceContext.java3
-rw-r--r--services/core/java/com/android/server/job/JobStore.java14
2 files changed, 11 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/job/JobServiceContext.java b/services/core/java/com/android/server/job/JobServiceContext.java
index 92b643cd6e7a..534faba3b013 100644
--- a/services/core/java/com/android/server/job/JobServiceContext.java
+++ b/services/core/java/com/android/server/job/JobServiceContext.java
@@ -481,11 +481,10 @@ public class JobServiceContext extends IJobCallback.Stub implements ServiceConne
*/
private void closeAndCleanupJobH(boolean reschedule) {
removeMessages(MSG_TIMEOUT);
+ mCompletedListener.onJobCompleted(mRunningJob, reschedule);
synchronized (mLock) {
mWakeLock.release();
mContext.unbindService(JobServiceContext.this);
- mCompletedListener.onJobCompleted(mRunningJob, reschedule);
-
mWakeLock = null;
mRunningJob = null;
mParams = null;
diff --git a/services/core/java/com/android/server/job/JobStore.java b/services/core/java/com/android/server/job/JobStore.java
index 5f22b346124e..4ac26c1f634e 100644
--- a/services/core/java/com/android/server/job/JobStore.java
+++ b/services/core/java/com/android/server/job/JobStore.java
@@ -262,16 +262,23 @@ public class JobStore {
@Override
public void run() {
final long startElapsed = SystemClock.elapsedRealtime();
+ List<JobStatus> mStoreCopy = new ArrayList<JobStatus>();
synchronized (JobStore.this) {
- writeJobsMapImpl();
+ // Copy over the jobs so we can release the lock before writing.
+ for (JobStatus jobStatus : mJobSet) {
+ JobStatus copy = new JobStatus(jobStatus.getJob(), jobStatus.getUid(),
+ jobStatus.getEarliestRunTime(), jobStatus.getLatestRunTimeElapsed());
+ mStoreCopy.add(copy);
+ }
}
+ writeJobsMapImpl(mStoreCopy);
if (JobSchedulerService.DEBUG) {
Slog.v(TAG, "Finished writing, took " + (SystemClock.elapsedRealtime()
- startElapsed) + "ms");
}
}
- private void writeJobsMapImpl() {
+ private void writeJobsMapImpl(List<JobStatus> jobList) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XmlSerializer out = new FastXmlSerializer();
@@ -281,8 +288,7 @@ public class JobStore {
out.startTag(null, "job-info");
out.attribute(null, "version", Integer.toString(JOBS_FILE_VERSION));
- for (int i = 0; i < mJobSet.size(); i++) {
- final JobStatus jobStatus = mJobSet.valueAt(i);
+ for (JobStatus jobStatus : jobList) {
if (DEBUG) {
Slog.d(TAG, "Saving job " + jobStatus.getJobId());
}