summaryrefslogtreecommitdiffstats
path: root/services/core/java/com/android
diff options
context:
space:
mode:
authorlouis_chang <louis_chang@htc.com>2015-11-06 12:52:45 +0800
committerSteve Kondik <steve@cyngn.com>2015-11-07 05:40:47 -0800
commita9c0e5854ead8dc6d279bf4352585f8d80c83e47 (patch)
tree28bf78194e84e69d22340e41e8de9ffdd40bea01 /services/core/java/com/android
parent9714e26df514a7b634545458a74925dc104f26c0 (diff)
downloadframeworks_base-a9c0e5854ead8dc6d279bf4352585f8d80c83e47.zip
frameworks_base-a9c0e5854ead8dc6d279bf4352585f8d80c83e47.tar.gz
frameworks_base-a9c0e5854ead8dc6d279bf4352585f8d80c83e47.tar.bz2
Avoid deadlock during device boot up
PowerManager invokes registerReceiver while holding mLock when system ready. There have chances that the system_server main thread will be blocked to wait for ActivityManagerService object while the other thread was performing configuration updates. Solution: Avoid holding locks while invokes registerReceiver() Similar issue: https://code.google.com/p/android/issues/detail?id=186872 Change-Id: I6f3db0758959bef5d8872c74e28e0491ee786ee6
Diffstat (limited to 'services/core/java/com/android')
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java32
1 files changed, 17 insertions, 15 deletions
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index dd7401d..d9e7d77 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -611,26 +611,28 @@ public final class PowerManagerService extends SystemService
// Initialize proximity sensor
mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+ }
- // 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);
+ // 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_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_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);
+ filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_DOCK_EVENT);
+ mContext.registerReceiver(new DockReceiver(), filter, null, mHandler);
+ synchronized (mLock) {
// Register for settings changes.
final ContentResolver resolver = mContext.getContentResolver();
resolver.registerContentObserver(Settings.Secure.getUriFor(