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
diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java b/quickstep/src/com/android/quickstep/RecentsAnimationWrapper.java
index 730984c..a247d79 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 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 @@
* 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 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 @@
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 @@
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();
}
});
}