From c4426af9eb02990f430d91caf3d1d54c34e83e55 Mon Sep 17 00:00:00 2001 From: "Shuichi.Noguchi" Date: Tue, 19 Dec 2017 19:44:48 +0900 Subject: [PATCH] Fix HdmiCecLocalDevice concurrent access Original implementation of HdmiCecLocalDevice expected only one thread refers ActionList. The concurrent access causes system_server crash. To enable for each thread to refer own ActionList without any conflict. Test: Sanity Test on Android TV connected to AVR. Repeat screen off and on quickly. Change-Id: I66f42dfbbd8d193f8a02d3ec5d51783149ddfeb2 --- .../core/java/com/android/server/hdmi/HdmiCecLocalDevice.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) mode change 100644 => 100755 services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java old mode 100644 new mode 100755 index e5f4282eefe0d..0cba76ba7346d --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -660,7 +660,8 @@ abstract class HdmiCecLocalDevice { @ServiceThreadOnly void startQueuedActions() { assertRunOnServiceThread(); - for (HdmiCecFeatureAction action : mActions) { + // Use copied action list in that start() may remove itself. + for (HdmiCecFeatureAction action : new ArrayList<>(mActions)) { if (!action.started()) { Slog.i(TAG, "Starting queued action:" + action); action.start();