diff options
| author | 2024-05-24 20:28:15 +0800 | |
|---|---|---|
| committer | 2024-05-29 04:37:45 +0000 | |
| commit | a8e15e02883553a490785f2b06d4b2f1286dc872 (patch) | |
| tree | dfa61a4aeed1d4f08df89ba842f9f43ebfc5eeac | |
| parent | eacb2c6312c7b7419b0572d3cca655861ad4a503 (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.java | 5 |
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); } /** |