From 6e544617c63ca1d60ed0a1a01630557958de093b Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Mon, 20 Feb 2017 11:02:26 -0700 Subject: [PATCH] Guard against possible AMS/PMS deadlock. PMS can't call into AMS while holding its local lock. Test: builds, boots Bug: 35410906 Change-Id: Ib80bbee5c0c3e5fb39ffef324e8176027da83f2f --- .../server/power/PowerManagerService.java | 109 +++++++++--------- 1 file changed, 55 insertions(+), 54 deletions(-) diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index ffbb4280b38e1..b76a24902f4ea 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -674,9 +674,6 @@ public final class PowerManagerService extends SystemService mAppOps, createSuspendBlockerLocked("PowerManagerService.Broadcasts"), mPolicy); - final ContentResolver resolver = mContext.getContentResolver(); - mConstants.start(resolver); - mWirelessChargerDetector = new WirelessChargerDetector(sensorManager, createSuspendBlockerLocked("PowerManagerService.WirelessChargerDetector"), mHandler); @@ -689,57 +686,6 @@ public final class PowerManagerService extends SystemService mDisplayManagerInternal.initPowerManagement( mDisplayPowerCallbacks, mHandler, sensorManager); - // Register for settings changes. - resolver.registerContentObserver(Settings.Secure.getUriFor( - Settings.Secure.SCREENSAVER_ENABLED), - false, mSettingsObserver, UserHandle.USER_ALL); - resolver.registerContentObserver(Settings.Secure.getUriFor( - Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP), - false, mSettingsObserver, UserHandle.USER_ALL); - resolver.registerContentObserver(Settings.Secure.getUriFor( - Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK), - false, mSettingsObserver, UserHandle.USER_ALL); - resolver.registerContentObserver(Settings.System.getUriFor( - Settings.System.SCREEN_OFF_TIMEOUT), - false, mSettingsObserver, UserHandle.USER_ALL); - resolver.registerContentObserver(Settings.Secure.getUriFor( - Settings.Secure.SLEEP_TIMEOUT), - false, mSettingsObserver, UserHandle.USER_ALL); - resolver.registerContentObserver(Settings.Global.getUriFor( - Settings.Global.STAY_ON_WHILE_PLUGGED_IN), - false, mSettingsObserver, UserHandle.USER_ALL); - resolver.registerContentObserver(Settings.System.getUriFor( - Settings.System.SCREEN_BRIGHTNESS), - false, mSettingsObserver, UserHandle.USER_ALL); - resolver.registerContentObserver(Settings.System.getUriFor( - Settings.System.SCREEN_BRIGHTNESS_FOR_VR), - false, mSettingsObserver, UserHandle.USER_ALL); - resolver.registerContentObserver(Settings.System.getUriFor( - Settings.System.SCREEN_BRIGHTNESS_MODE), - false, mSettingsObserver, UserHandle.USER_ALL); - resolver.registerContentObserver(Settings.System.getUriFor( - Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ), - false, mSettingsObserver, UserHandle.USER_ALL); - resolver.registerContentObserver(Settings.Global.getUriFor( - Settings.Global.LOW_POWER_MODE), - false, mSettingsObserver, UserHandle.USER_ALL); - resolver.registerContentObserver(Settings.Global.getUriFor( - Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL), - false, mSettingsObserver, UserHandle.USER_ALL); - resolver.registerContentObserver(Settings.Global.getUriFor( - Settings.Global.THEATER_MODE_ON), - false, mSettingsObserver, UserHandle.USER_ALL); - resolver.registerContentObserver(Settings.Secure.getUriFor( - Settings.Secure.DOUBLE_TAP_TO_WAKE), - false, mSettingsObserver, UserHandle.USER_ALL); - IVrManager vrManager = (IVrManager) getBinderService(Context.VR_SERVICE); - if (vrManager != null) { - try { - vrManager.registerListener(mVrStateCallbacks); - } catch (RemoteException e) { - Slog.e(TAG, "Failed to register VR mode state listener: " + e); - } - } // Go. readConfigurationLocked(); updateSettingsLocked(); @@ -747,6 +693,61 @@ public final class PowerManagerService extends SystemService updatePowerStateLocked(); } + final ContentResolver resolver = mContext.getContentResolver(); + mConstants.start(resolver); + + // Register for settings changes. + resolver.registerContentObserver(Settings.Secure.getUriFor( + Settings.Secure.SCREENSAVER_ENABLED), + false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.Secure.getUriFor( + Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP), + false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.Secure.getUriFor( + Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK), + false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.SCREEN_OFF_TIMEOUT), + false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.Secure.getUriFor( + Settings.Secure.SLEEP_TIMEOUT), + false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.Global.getUriFor( + Settings.Global.STAY_ON_WHILE_PLUGGED_IN), + false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.SCREEN_BRIGHTNESS), + false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.SCREEN_BRIGHTNESS_FOR_VR), + false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.SCREEN_BRIGHTNESS_MODE), + false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ), + false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.Global.getUriFor( + Settings.Global.LOW_POWER_MODE), + false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.Global.getUriFor( + Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL), + false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.Global.getUriFor( + Settings.Global.THEATER_MODE_ON), + false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.Secure.getUriFor( + Settings.Secure.DOUBLE_TAP_TO_WAKE), + false, mSettingsObserver, UserHandle.USER_ALL); + IVrManager vrManager = (IVrManager) getBinderService(Context.VR_SERVICE); + if (vrManager != null) { + try { + vrManager.registerListener(mVrStateCallbacks); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to register VR mode state listener: " + e); + } + } + // Register for broadcasts from other components of the system. IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED);