summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author lijilou <lijilou@xiaomi.corp-partner.google.com> 2024-05-24 20:28:15 +0800
committer Jilou li <lijilou@xiaomi.corp-partner.google.com> 2024-05-29 04:37:45 +0000
commita8e15e02883553a490785f2b06d4b2f1286dc872 (patch)
treedfa61a4aeed1d4f08df89ba842f9f43ebfc5eeac
parenteacb2c6312c7b7419b0572d3cca655861ad4a503 (diff)
JobSchedulerService:fix arrayIndexOutOfBoundsException to aviod
systemServer crash. As can be seen from the AOSP code, the set collection mTrackedTasks is accessed under mLock, but there is no mLock lock in the reportNewIdleState function. Therefore, we should put onControllerStateChanged into the mLock lock for execution, just like all other Controllers calling this method with mLock, there is no risk of deadlock. Test: OEM monkey test Bug: 342554438 Change-Id: I596defa8ca018a7161cd149a54a029f6adb96937
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java5
1 files changed, 4 insertions, 1 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java
index adee322f60cf..f722e41c6195 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java
@@ -48,6 +48,7 @@ public final class IdleController extends RestrictingController implements Idlen
private static final String TAG = "JobScheduler.IdleController";
// Policy: we decide that we're "idle" if the device has been unused /
// screen off or dreaming or wireless charging dock idle for at least this long
+ @GuardedBy("mLock")
final ArraySet<JobStatus> mTrackedTasks = new ArraySet<>();
IdlenessTracker mIdleTracker;
private final FlexibilityController mFlexibilityController;
@@ -118,8 +119,10 @@ public final class IdleController extends RestrictingController implements Idlen
for (int i = mTrackedTasks.size()-1; i >= 0; i--) {
mTrackedTasks.valueAt(i).setIdleConstraintSatisfied(nowElapsed, isIdle);
}
+ if (!mTrackedTasks.isEmpty()) {
+ mStateChangedListener.onControllerStateChanged(mTrackedTasks);
+ }
}
- mStateChangedListener.onControllerStateChanged(mTrackedTasks);
}
/**