Merge "Fix DisplayManager race condition when state is unknown" into tm-qpr-dev

This commit is contained in:
Nicolò Mazzucato
2023-01-10 07:58:29 +00:00
committed by Android (Google) Code Review
2 changed files with 8 additions and 14 deletions

View File

@@ -817,9 +817,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mDisplayDeviceConfig = config; mDisplayDeviceConfig = config;
loadFromDisplayDeviceConfig(token, info); loadFromDisplayDeviceConfig(token, info);
// Since the underlying display-device changed, we really don't know the /// Since the underlying display-device changed, we really don't know the
// last command that was sent to change it's state. Lets assume it is off and we // last command that was sent to change it's state. Lets assume it is unknown so
// trigger a change immediately. // that we trigger a change immediately.
mPowerState.resetScreenState(); mPowerState.resetScreenState();
} }
if (mIsEnabled != isEnabled || mIsInTransition != isInTransition) { if (mIsEnabled != isEnabled || mIsInTransition != isInTransition) {

View File

@@ -340,20 +340,12 @@ final class DisplayPowerState {
} }
/** /**
* Resets the screen state to {@link Display#STATE_OFF}. Even though we do not know the last * Resets the screen state to unknown. Useful when the underlying display-device changes for the
* state that was sent to the underlying display-device, we assume it is off. * LogicalDisplay and we do not know the last state that was sent to it.
*
* We do not set the screen state to {@link Display#STATE_UNKNOWN} to avoid getting in the state
* where PhotonicModulator holds onto the lock. This happens because we currently try to keep
* the mScreenState and mPendingState in sync, however if the screenState is set to
* {@link Display#STATE_UNKNOWN} here, mPendingState will get progressed to this, which will
* force the PhotonicModulator thread to wait onto the lock to take it out of that state.
* b/262294651 for more info.
*/ */
void resetScreenState() { void resetScreenState() {
mScreenState = Display.STATE_OFF; mScreenState = Display.STATE_UNKNOWN;
mScreenReady = false; mScreenReady = false;
scheduleScreenUpdate();
} }
private void scheduleScreenUpdate() { private void scheduleScreenUpdate() {
@@ -514,6 +506,8 @@ final class DisplayPowerState {
boolean valid = state != Display.STATE_UNKNOWN && !Float.isNaN(brightnessState); boolean valid = state != Display.STATE_UNKNOWN && !Float.isNaN(brightnessState);
boolean changed = stateChanged || backlightChanged; boolean changed = stateChanged || backlightChanged;
if (!valid || !changed) { if (!valid || !changed) {
mStateChangeInProgress = false;
mBacklightChangeInProgress = false;
try { try {
mLock.wait(); mLock.wait();
} catch (InterruptedException ex) { } catch (InterruptedException ex) {