diff options
author | Shibin George <shibing@codeaurora.org> | 2016-07-06 02:12:10 +0530 |
---|---|---|
committer | Shibin George <shibing@codeaurora.org> | 2016-07-07 19:45:35 +0530 |
commit | 43f5de0125a22e9bcc4cf675034116f754f3bfc2 (patch) | |
tree | 6b544b456ebece3903c3d8534c3d99f4bfc95e30 | |
parent | fcae61308ca0a0dc91dc8d8d1e798c6313d202e1 (diff) | |
download | base-43f5de0125a22e9bcc4cf675034116f754f3bfc2.tar.gz |
Resolve deadlock between ActivityManagerService and PowerManagerService
ActivityManagerService lock and PowerManagerService.mLock can
be acquired in different threads in different orders.
registerReceiver() here tries to acquire ActivityManagerService
internally while holding mLock. A particular call from
WindowManagerService acquires these locks in reverse order.
This deadlock can be resolved by moving registerReceiver()
to another thread.
https://code.google.com/p/android/issues/detail?id=215254
Change-Id: I12cd610e61f212a3fb5e441f2c7a557c90afbda4
Signed-off-by: Shibin George <shibing@codeaurora.org>
-rw-r--r-- | services/core/java/com/android/server/power/PowerManagerService.java | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index ced04336dfac..cab85634ee0e 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -553,25 +553,6 @@ public final class PowerManagerService extends SystemService mDisplayManagerInternal.initPowerManagement( mDisplayPowerCallbacks, mHandler, sensorManager); - // Register for broadcasts from other components of the system. - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_BATTERY_CHANGED); - filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); - mContext.registerReceiver(new BatteryReceiver(), filter, null, mHandler); - - filter = new IntentFilter(); - filter.addAction(Intent.ACTION_DREAMING_STARTED); - filter.addAction(Intent.ACTION_DREAMING_STOPPED); - mContext.registerReceiver(new DreamReceiver(), filter, null, mHandler); - - filter = new IntentFilter(); - filter.addAction(Intent.ACTION_USER_SWITCHED); - mContext.registerReceiver(new UserSwitchedReceiver(), filter, null, mHandler); - - filter = new IntentFilter(); - filter.addAction(Intent.ACTION_DOCK_EVENT); - mContext.registerReceiver(new DockReceiver(), filter, null, mHandler); - // Register for settings changes. final ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver(Settings.Secure.getUriFor( @@ -619,6 +600,25 @@ public final class PowerManagerService extends SystemService mDirty |= DIRTY_BATTERY_STATE; updatePowerStateLocked(); } + + // Register for broadcasts from other components of the system. + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_BATTERY_CHANGED); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + mContext.registerReceiver(new BatteryReceiver(), filter, null, mHandler); + + filter = new IntentFilter(); + filter.addAction(Intent.ACTION_DREAMING_STARTED); + filter.addAction(Intent.ACTION_DREAMING_STOPPED); + mContext.registerReceiver(new DreamReceiver(), filter, null, mHandler); + + filter = new IntentFilter(); + filter.addAction(Intent.ACTION_USER_SWITCHED); + mContext.registerReceiver(new UserSwitchedReceiver(), filter, null, mHandler); + + filter = new IntentFilter(); + filter.addAction(Intent.ACTION_DOCK_EVENT); + mContext.registerReceiver(new DockReceiver(), filter, null, mHandler); } private void readConfigurationLocked() { |