Fix issue #28817455: [NYC] [BullHead] Fatal Exception in CNEService

Deadlock between DeviceIdleController and NetworkPolicyManagerService
because DeviceIdleController was calling out to ConnectivityService
with its lock held.

Change-Id: I21195c2dfd5f50d0264e5e32819f8fc1f35a23a9
This commit is contained in:
Dianne Hackborn
2016-05-17 13:55:29 -07:00
parent 1fef88d8dc
commit 4cb96ca45f

View File

@@ -325,9 +325,7 @@ public class DeviceIdleController extends SystemService
@Override public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
case ConnectivityManager.CONNECTIVITY_ACTION: {
synchronized (DeviceIdleController.this) {
updateConnectivityStateLocked(intent);
}
updateConnectivityState(intent);
} break;
case Intent.ACTION_BATTERY_CHANGED: {
synchronized (DeviceIdleController.this) {
@@ -1426,9 +1424,9 @@ public class DeviceIdleController extends SystemService
mLocalPowerManager.setDeviceIdleWhitelist(mPowerSaveWhitelistAllAppIdArray);
mLocalAlarmManager.setDeviceIdleUserWhitelist(mPowerSaveWhitelistUserAppIdArray);
mDisplayManager.registerDisplayListener(mDisplayListener, null);
updateConnectivityStateLocked(null);
updateDisplayLocked();
}
updateConnectivityState(null);
}
}
@@ -1707,9 +1705,17 @@ public class DeviceIdleController extends SystemService
}
}
void updateConnectivityStateLocked(Intent connIntent) {
if (mConnectivityService != null) {
NetworkInfo ni = mConnectivityService.getActiveNetworkInfo();
void updateConnectivityState(Intent connIntent) {
ConnectivityService cm;
synchronized (this) {
cm = mConnectivityService;
}
if (cm == null) {
return;
}
// Note: can't call out to ConnectivityService with our lock held.
NetworkInfo ni = cm.getActiveNetworkInfo();
synchronized (this) {
boolean conn;
if (ni == null) {
conn = false;