diff options
Diffstat (limited to 'com/android/server/job/JobStore.java')
-rw-r--r-- | com/android/server/job/JobStore.java | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/com/android/server/job/JobStore.java b/com/android/server/job/JobStore.java index 36cacd7a..a24a4ac3 100644 --- a/com/android/server/job/JobStore.java +++ b/com/android/server/job/JobStore.java @@ -72,6 +72,9 @@ import java.util.Set; * This is important b/c {@link com.android.server.job.JobStore.WriteJobsMapToDiskRunnable} * and {@link com.android.server.job.JobStore.ReadJobMapFromDiskRunnable} lock on that * object. + * + * Test: + * atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java */ public final class JobStore { private static final String TAG = "JobStore"; @@ -427,6 +430,9 @@ public final class JobStore { out.attribute(null, "uid", Integer.toString(jobStatus.getUid())); out.attribute(null, "priority", String.valueOf(jobStatus.getPriority())); out.attribute(null, "flags", String.valueOf(jobStatus.getFlags())); + if (jobStatus.getInternalFlags() != 0) { + out.attribute(null, "internalFlags", String.valueOf(jobStatus.getInternalFlags())); + } out.attribute(null, "lastSuccessfulRunTime", String.valueOf(jobStatus.getLastSuccessfulRunTime())); @@ -689,6 +695,7 @@ public final class JobStore { int uid, sourceUserId; long lastSuccessfulRunTime; long lastFailedRunTime; + int internalFlags = 0; // Read out job identifier attributes and priority. try { @@ -704,6 +711,10 @@ public final class JobStore { if (val != null) { jobBuilder.setFlags(Integer.parseInt(val)); } + val = parser.getAttributeValue(null, "internalFlags"); + if (val != null) { + internalFlags = Integer.parseInt(val); + } val = parser.getAttributeValue(null, "sourceUserId"); sourceUserId = val == null ? -1 : Integer.parseInt(val); @@ -718,7 +729,6 @@ public final class JobStore { } String sourcePackageName = parser.getAttributeValue(null, "sourcePackageName"); - final String sourceTag = parser.getAttributeValue(null, "sourceTag"); int eventType; @@ -857,7 +867,7 @@ public final class JobStore { appBucket, currentHeartbeat, sourceTag, elapsedRuntimes.first, elapsedRuntimes.second, lastSuccessfulRunTime, lastFailedRunTime, - (rtcIsGood) ? null : rtcRuntimes); + (rtcIsGood) ? null : rtcRuntimes, internalFlags); return js; } @@ -1042,13 +1052,18 @@ public final class JobStore { final ArraySet<JobStatus> jobs = mJobs.get(uid); final int sourceUid = job.getSourceUid(); final ArraySet<JobStatus> jobsForSourceUid = mJobsPerSourceUid.get(sourceUid); - boolean didRemove = jobs != null && jobs.remove(job) && jobsForSourceUid.remove(job); - if (didRemove) { - if (jobs.size() == 0) { - // no more jobs for this uid; let the now-empty set object be GC'd. + final boolean didRemove = jobs != null && jobs.remove(job); + final boolean sourceRemove = jobsForSourceUid != null && jobsForSourceUid.remove(job); + if (didRemove != sourceRemove) { + Slog.wtf(TAG, "Job presence mismatch; caller=" + didRemove + + " source=" + sourceRemove); + } + if (didRemove || sourceRemove) { + // no more jobs for this uid? let the now-empty set objects be GC'd. + if (jobs != null && jobs.size() == 0) { mJobs.remove(uid); } - if (jobsForSourceUid.size() == 0) { + if (jobsForSourceUid != null && jobsForSourceUid.size() == 0) { mJobsPerSourceUid.remove(sourceUid); } return true; |