Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4cb96ca4 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

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
parent 1fef88d8
Loading
Loading
Loading
Loading
+13 −7
Original line number Original line Diff line number Diff line
@@ -325,9 +325,7 @@ public class DeviceIdleController extends SystemService
        @Override public void onReceive(Context context, Intent intent) {
        @Override public void onReceive(Context context, Intent intent) {
            switch (intent.getAction()) {
            switch (intent.getAction()) {
                case ConnectivityManager.CONNECTIVITY_ACTION: {
                case ConnectivityManager.CONNECTIVITY_ACTION: {
                    synchronized (DeviceIdleController.this) {
                    updateConnectivityState(intent);
                        updateConnectivityStateLocked(intent);
                    }
                } break;
                } break;
                case Intent.ACTION_BATTERY_CHANGED: {
                case Intent.ACTION_BATTERY_CHANGED: {
                    synchronized (DeviceIdleController.this) {
                    synchronized (DeviceIdleController.this) {
@@ -1426,9 +1424,9 @@ public class DeviceIdleController extends SystemService
                mLocalPowerManager.setDeviceIdleWhitelist(mPowerSaveWhitelistAllAppIdArray);
                mLocalPowerManager.setDeviceIdleWhitelist(mPowerSaveWhitelistAllAppIdArray);
                mLocalAlarmManager.setDeviceIdleUserWhitelist(mPowerSaveWhitelistUserAppIdArray);
                mLocalAlarmManager.setDeviceIdleUserWhitelist(mPowerSaveWhitelistUserAppIdArray);
                mDisplayManager.registerDisplayListener(mDisplayListener, null);
                mDisplayManager.registerDisplayListener(mDisplayListener, null);
                updateConnectivityStateLocked(null);
                updateDisplayLocked();
                updateDisplayLocked();
            }
            }
            updateConnectivityState(null);
        }
        }
    }
    }


@@ -1707,9 +1705,17 @@ public class DeviceIdleController extends SystemService
        }
        }
    }
    }


    void updateConnectivityStateLocked(Intent connIntent) {
    void updateConnectivityState(Intent connIntent) {
        if (mConnectivityService != null) {
        ConnectivityService cm;
            NetworkInfo ni = mConnectivityService.getActiveNetworkInfo();
        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;
            boolean conn;
            if (ni == null) {
            if (ni == null) {
                conn = false;
                conn = false;