diff options
author | louis_chang <louis_chang@htc.com> | 2015-11-06 12:52:45 +0800 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2015-11-07 05:40:47 -0800 |
commit | a9c0e5854ead8dc6d279bf4352585f8d80c83e47 (patch) | |
tree | 28bf78194e84e69d22340e41e8de9ffdd40bea01 /services/core/java/com/android | |
parent | 9714e26df514a7b634545458a74925dc104f26c0 (diff) | |
download | frameworks_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.java | 32 |
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( |