summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author wumin3 <wumin3@xiaomi.com> 2024-03-26 15:26:30 +0800
committer wumin3 <wumin3@xiaomi.com> 2024-03-26 15:26:30 +0800
commit1853357fbe7cf0b690df5e1f6eaab83d2db2d74c (patch)
treef524a20d939900d0fda79ce5ac2851d2443e7904
parentcab0c542fa90ab6c530820c3d45c054b4170e657 (diff)
MediaSessionRecord: add synchronize control for modification of mControllerCallbackHolders
// ArrayIndexOutOfBoundsException thrown when unregisterCallback() 03-13 18:57:16.455 2112 6787 E JavaBinder: *** Uncaught remote exception! Exceptions are not yet supported across processes. Client PID 3726 UID 1000. 03-13 18:57:16.455 2112 6787 E JavaBinder: java.lang.ArrayIndexOutOfBoundsException: length=0; index=1 03-13 18:57:16.455 2112 6787 E JavaBinder: at java.util.concurrent.CopyOnWriteArrayList.elementAt(CopyOnWriteArrayList.java:389) 03-13 18:57:16.455 2112 6787 E JavaBinder: at java.util.concurrent.CopyOnWriteArrayList.remove(CopyOnWriteArrayList.java:482) 03-13 18:57:16.455 2112 6787 E JavaBinder: at com.android.server.media.MediaSessionRecord$ControllerStub.unregisterCallback(MediaSessionRecord.java:1714) 03-13 18:57:16.455 2112 6787 E JavaBinder: at android.media.session.ISessionController$Stub.onTransact(ISessionController.java:394) 03-13 18:57:16.455 2112 6787 E JavaBinder: at android.os.Binder.execTransactInternal(Binder.java:1351) 03-13 18:57:16.455 2112 6787 E JavaBinder: at android.os.Binder.execTransact(Binder.java:1282) Change-Id: I02c3011ac8d27171016dd15ce7dbbadff4a2bb65 Signed-off-by: wumin3 <wumin3@xiaomi.com>
-rw-r--r--services/core/java/com/android/server/media/MediaSessionRecord.java27
1 files changed, 19 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index 994d3ca1124f..6f8a46be089f 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -786,7 +786,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR
}
}
if (deadCallbackHolders != null) {
- mControllerCallbackHolders.removeAll(deadCallbackHolders);
+ removeControllerHoldersSafely(deadCallbackHolders);
}
}
@@ -813,7 +813,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR
}
}
if (deadCallbackHolders != null) {
- mControllerCallbackHolders.removeAll(deadCallbackHolders);
+ removeControllerHoldersSafely(deadCallbackHolders);
}
}
@@ -848,7 +848,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR
}
}
if (deadCallbackHolders != null) {
- mControllerCallbackHolders.removeAll(deadCallbackHolders);
+ removeControllerHoldersSafely(deadCallbackHolders);
}
}
@@ -875,7 +875,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR
}
}
if (deadCallbackHolders != null) {
- mControllerCallbackHolders.removeAll(deadCallbackHolders);
+ removeControllerHoldersSafely(deadCallbackHolders);
}
}
@@ -902,7 +902,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR
}
}
if (deadCallbackHolders != null) {
- mControllerCallbackHolders.removeAll(deadCallbackHolders);
+ removeControllerHoldersSafely(deadCallbackHolders);
}
}
@@ -929,7 +929,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR
}
}
if (deadCallbackHolders != null) {
- mControllerCallbackHolders.removeAll(deadCallbackHolders);
+ removeControllerHoldersSafely(deadCallbackHolders);
}
}
@@ -954,7 +954,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR
}
}
if (deadCallbackHolders != null) {
- mControllerCallbackHolders.removeAll(deadCallbackHolders);
+ removeControllerHoldersSafely(deadCallbackHolders);
}
}
@@ -979,7 +979,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR
}
}
// After notifying clear all listeners
- mControllerCallbackHolders.clear();
+ removeControllerHoldersSafely(null);
}
private PlaybackState getStateWithUpdatedPosition() {
@@ -1027,6 +1027,17 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR
return -1;
}
+ private void removeControllerHoldersSafely(
+ Collection<ISessionControllerCallbackHolder> holders) {
+ synchronized (mLock) {
+ if (holders == null) {
+ mControllerCallbackHolders.clear();
+ } else {
+ mControllerCallbackHolders.removeAll(holders);
+ }
+ }
+ }
+
private PlaybackInfo getVolumeAttributes() {
int volumeType;
AudioAttributes attributes;