Merge "Fix concurrent modification crash in onAlarm"
diff --git a/services/core/java/com/android/server/GraphicsStatsService.java b/services/core/java/com/android/server/GraphicsStatsService.java
index bdd80e38..14a9a31 100644
--- a/services/core/java/com/android/server/GraphicsStatsService.java
+++ b/services/core/java/com/android/server/GraphicsStatsService.java
@@ -137,16 +137,21 @@
}
private void onAlarm() {
+ // We need to make a copy since some of the callbacks won't be proxy and thus
+ // can result in a re-entrant acquisition of mLock that would result in a modification
+ // of mActive during iteration.
+ ActiveBuffer[] activeCopy;
synchronized (mLock) {
mRotateIsScheduled = false;
scheduleRotateLocked();
- for (ActiveBuffer active : mActive) {
- try {
- active.mCallback.onRotateGraphicsStatsBuffer();
- } catch (RemoteException e) {
- Log.w(TAG, String.format("Failed to notify '%s' (pid=%d) to rotate buffers",
- active.mInfo.packageName, active.mPid), e);
- }
+ activeCopy = mActive.toArray(new ActiveBuffer[0]);
+ }
+ for (ActiveBuffer active : activeCopy) {
+ try {
+ active.mCallback.onRotateGraphicsStatsBuffer();
+ } catch (RemoteException e) {
+ Log.w(TAG, String.format("Failed to notify '%s' (pid=%d) to rotate buffers",
+ active.mInfo.packageName, active.mPid), e);
}
}
// Give a few seconds for everyone to rotate before doing the cleanup