Merge "Move blocking surface operations out of lock"
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index eebc738..cf94d46 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -37,6 +37,7 @@
import android.view.Surface;
import android.view.SurfaceControl;
+import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.LocalServices;
import com.android.server.lights.Light;
import com.android.server.lights.LightsManager;
@@ -641,9 +642,7 @@
@Override
public void setRequestedColorModeLocked(int colorMode) {
- if (requestColorModeLocked(colorMode)) {
- updateDeviceInfoLocked();
- }
+ requestColorModeLocked(colorMode);
}
@Override
@@ -671,12 +670,22 @@
if (mDisplayModeSpecsInvalid || !displayModeSpecs.equals(mDisplayModeSpecs)) {
mDisplayModeSpecsInvalid = false;
mDisplayModeSpecs.copyFrom(displayModeSpecs);
- final IBinder token = getDisplayTokenLocked();
- SurfaceControl.setDesiredDisplayConfigSpecs(token,
+ getHandler().sendMessage(PooledLambda.obtainMessage(
+ LocalDisplayDevice::setDesiredDisplayModeSpecsAsync, this,
+ getDisplayTokenLocked(),
new SurfaceControl.DesiredDisplayConfigSpecs(defaultPhysIndex,
mDisplayModeSpecs.refreshRateRange.min,
- mDisplayModeSpecs.refreshRateRange.max));
- int activePhysIndex = SurfaceControl.getActiveConfig(token);
+ mDisplayModeSpecs.refreshRateRange.max)));
+ }
+ }
+
+ private void setDesiredDisplayModeSpecsAsync(IBinder displayToken,
+ SurfaceControl.DesiredDisplayConfigSpecs configSpecs) {
+ // Do not lock when calling these SurfaceControl methods because they are sync
+ // operations that may block for a while when setting display power mode.
+ SurfaceControl.setDesiredDisplayConfigSpecs(displayToken, configSpecs);
+ final int activePhysIndex = SurfaceControl.getActiveConfig(displayToken);
+ synchronized (getSyncRoot()) {
if (updateActiveModeLocked(activePhysIndex)) {
updateDeviceInfoLocked();
}
@@ -708,19 +717,30 @@
return true;
}
- public boolean requestColorModeLocked(int colorMode) {
+ public void requestColorModeLocked(int colorMode) {
if (mActiveColorMode == colorMode) {
- return false;
+ return;
}
if (!mSupportedColorModes.contains(colorMode)) {
Slog.w(TAG, "Unable to find color mode " + colorMode
+ ", ignoring request.");
- return false;
+ return;
}
- SurfaceControl.setActiveColorMode(getDisplayTokenLocked(), colorMode);
+
mActiveColorMode = colorMode;
mActiveColorModeInvalid = false;
- return true;
+ getHandler().sendMessage(PooledLambda.obtainMessage(
+ LocalDisplayDevice::requestColorModeAsync, this,
+ getDisplayTokenLocked(), colorMode));
+ }
+
+ private void requestColorModeAsync(IBinder displayToken, int colorMode) {
+ // Do not lock when calling this SurfaceControl method because it is a sync operation
+ // that may block for a while when setting display power mode.
+ SurfaceControl.setActiveColorMode(displayToken, colorMode);
+ synchronized (getSyncRoot()) {
+ updateDeviceInfoLocked();
+ }
}
@Override