summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShibin George <shibing@codeaurora.org>2016-07-06 02:12:10 +0530
committerShibin George <shibing@codeaurora.org>2016-07-07 19:45:35 +0530
commit43f5de0125a22e9bcc4cf675034116f754f3bfc2 (patch)
tree6b544b456ebece3903c3d8534c3d99f4bfc95e30
parentfcae61308ca0a0dc91dc8d8d1e798c6313d202e1 (diff)
downloadbase-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.java38
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() {