VibrationSettings: add synchronized control for access of mProcStatesCache
// exception caused by concurrent access of mProcStatesCache
java.lang.ArrayIndexOutOfBoundsException: src.length=95 srcPos=-39 dst.length=95 dstPos=-38 length=93
at java.lang.System.arraycopy(System.java:637)
at com.android.internal.util.GrowingArrayUtils.insert(GrowingArrayUtils.java:155)
at android.util.SparseArray.put(SparseArray.java:280)
at com.android.server.vibrator.VibrationSettings$UidObserver.onUidStateChanged(VibrationSettings.java:736)
at com.android.server.am.UidObserverController.dispatchUidsChangedForObserver(UidObserverController.java:332)
at com.android.server.am.UidObserverController.dispatchUidsChanged(UidObserverController.java:207)
at com.android.server.am.UidObserverController$$ExternalSyntheticLambda0.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:211)
at android.os.Looper.loop(Looper.java:300)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
at com.android.server.UiThread.run(UiThread.java:45)
Change-Id: Ie81c7deb617123ad427f8970d66d5fa0da3e723d
Signed-off-by: wumin3 <wumin3@xiaomi.com>
diff --git a/services/core/java/com/android/server/vibrator/VibrationSettings.java b/services/core/java/com/android/server/vibrator/VibrationSettings.java
index 9cf0834..749cd8e 100644
--- a/services/core/java/com/android/server/vibrator/VibrationSettings.java
+++ b/services/core/java/com/android/server/vibrator/VibrationSettings.java
@@ -731,18 +731,24 @@
private final SparseArray<Integer> mProcStatesCache = new SparseArray<>();
public boolean isUidForeground(int uid) {
- return mProcStatesCache.get(uid, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND)
- <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
+ synchronized (this) {
+ return mProcStatesCache.get(uid, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND)
+ <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;
+ }
}
@Override
public void onUidGone(int uid, boolean disabled) {
- mProcStatesCache.delete(uid);
+ synchronized (this) {
+ mProcStatesCache.delete(uid);
+ }
}
@Override
public void onUidStateChanged(int uid, int procState, long procStateSeq, int capability) {
- mProcStatesCache.put(uid, procState);
+ synchronized (this) {
+ mProcStatesCache.put(uid, procState);
+ }
}
}