From 12c4ecb015d805153cb05712fb596f75d482d7ab Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Wed, 9 May 2018 10:47:35 -0700 Subject: [PATCH] Fix lock contention while swiping up - Don't lock when making WM calls (only lock when resetting), and use own executor since the background executor is fixed to only two threads and other things can be running on them already (like task loading). Bug: 78585335 Change-Id: I56e24fbbdeb3b673837982df3fa67e485d03b3b2 --- .../quickstep/RecentsAnimationWrapper.java | 74 +++++++++---------- 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java b/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java index 730984c934..a247d79098 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java @@ -15,10 +15,14 @@ */ package com.android.quickstep; +import com.android.launcher3.util.LooperExecutor; import com.android.launcher3.util.TraceHelper; +import com.android.launcher3.util.UiThreadHelper; import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.systemui.shared.system.BackgroundExecutor; import com.android.systemui.shared.system.RecentsAnimationControllerCompat; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * Wrapper around RecentsAnimationController to help with some synchronization @@ -28,6 +32,9 @@ public class RecentsAnimationWrapper { public RecentsAnimationControllerCompat controller; public RemoteAnimationTargetSet targetSet; + private final ExecutorService mExecutorService = + new LooperExecutor(UiThreadHelper.getBackgroundLooper()); + private boolean mInputConsumerEnabled = false; private boolean mBehindSystemBars = true; private boolean mSplitScreenMinimized = false; @@ -48,17 +55,16 @@ public class RecentsAnimationWrapper { * on the background thread. */ public void finish(boolean toHome, Runnable onFinishComplete) { - BackgroundExecutor.get().submit(() -> { - synchronized (this) { - TraceHelper.endSection("RecentsController", - "Finish " + controller + ", toHome=" + toHome); - if (controller != null) { - controller.setInputConsumerEnabled(false); - controller.finish(toHome); - if (onFinishComplete != null) { - onFinishComplete.run(); - } - controller = null; + mExecutorService.submit(() -> { + TraceHelper.endSection("RecentsController", + "Finish " + controller + ", toHome=" + toHome); + RecentsAnimationControllerCompat thisController = controller; + controller = null; + if (thisController != null) { + thisController.setInputConsumerEnabled(false); + thisController.finish(toHome); + if (onFinishComplete != null) { + onFinishComplete.run(); } } }); @@ -67,13 +73,11 @@ public class RecentsAnimationWrapper { public void enableInputConsumer() { mInputConsumerEnabled = true; if (mInputConsumerEnabled) { - BackgroundExecutor.get().submit(() -> { - synchronized (this) { - TraceHelper.partitionSection("RecentsController", - "Enabling consumer on " + controller); - if (controller != null) { - controller.setInputConsumerEnabled(true); - } + mExecutorService.submit(() -> { + TraceHelper.partitionSection("RecentsController", + "Enabling consumer on " + controller); + if (controller != null) { + controller.setInputConsumerEnabled(true); } }); } @@ -84,13 +88,11 @@ public class RecentsAnimationWrapper { return; } mBehindSystemBars = behindSystemBars; - BackgroundExecutor.get().submit(() -> { - synchronized (this) { - TraceHelper.partitionSection("RecentsController", - "Setting behind system bars on " + controller); - if (controller != null) { - controller.setAnimationTargetsBehindSystemBars(behindSystemBars); - } + mExecutorService.submit(() -> { + TraceHelper.partitionSection("RecentsController", + "Setting behind system bars on " + controller); + if (controller != null) { + controller.setAnimationTargetsBehindSystemBars(behindSystemBars); } }); } @@ -106,24 +108,20 @@ public class RecentsAnimationWrapper { return; } mSplitScreenMinimized = minimized; - BackgroundExecutor.get().submit(() -> { - synchronized (this) { - TraceHelper.partitionSection("RecentsController", - "Setting minimize dock on " + controller); - if (controller != null) { - controller.setSplitScreenMinimized(minimized); - } + mExecutorService.submit(() -> { + TraceHelper.partitionSection("RecentsController", + "Setting minimize dock on " + controller); + if (controller != null) { + controller.setSplitScreenMinimized(minimized); } }); } public void hideCurrentInputMethod() { - BackgroundExecutor.get().submit(() -> { - synchronized (this) { - TraceHelper.partitionSection("RecentsController", "Hiding currentinput method"); - if (controller != null) { - controller.hideCurrentInputMethod(); - } + mExecutorService.submit(() -> { + TraceHelper.partitionSection("RecentsController", "Hiding currentinput method"); + if (controller != null) { + controller.hideCurrentInputMethod(); } }); }