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

Commit 2c9f5475 authored by Robert Greenwalt's avatar Robert Greenwalt
Browse files

Make sure events handled on same looper

Two handlers are used to call a function, but the init was not forcing them on the
same looper/thread, so we could get synchronization problems as a result.

Moved to a single looper.

Also added finally clauses to clean up if a broadcast throws an uncaught exception.

bug:13399768
Change-Id: I0044e2442335ee45a15588f910064e848cf6ac55
parent ad7b890f
Loading
Loading
Loading
Loading
+99 −65
Original line number Diff line number Diff line
@@ -153,7 +153,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
     */
    private NativeDaemonConnector mConnector;

    private final Handler mMainHandler = new Handler();
    private final Handler mFgHandler;

    private IBatteryStats mBatteryStats;

@@ -203,6 +203,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub
    private NetworkManagementService(Context context, String socket) {
        mContext = context;

        // make sure this is on the same looper as our NativeDaemonConnector for sync purposes
        mFgHandler = new Handler(FgThread.get().getLooper());

        if ("simulator".equals(SystemProperties.get("ro.product.device"))) {
            return;
        }
@@ -271,6 +274,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
     */
    private void notifyInterfaceStatusChanged(String iface, boolean up) {
        final int length = mObservers.beginBroadcast();
        try {
            for (int i = 0; i < length; i++) {
                try {
                    mObservers.getBroadcastItem(i).interfaceStatusChanged(iface, up);
@@ -278,8 +282,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub
                } catch (RuntimeException e) {
                }
            }
        } finally {
            mObservers.finishBroadcast();
        }
    }

    /**
     * Notify our observers of an interface link state change
@@ -287,6 +293,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
     */
    private void notifyInterfaceLinkStateChanged(String iface, boolean up) {
        final int length = mObservers.beginBroadcast();
        try {
            for (int i = 0; i < length; i++) {
                try {
                    mObservers.getBroadcastItem(i).interfaceLinkStateChanged(iface, up);
@@ -294,14 +301,17 @@ public class NetworkManagementService extends INetworkManagementService.Stub
                } catch (RuntimeException e) {
                }
            }
        } finally {
            mObservers.finishBroadcast();
        }
    }

    /**
     * Notify our observers of an interface addition.
     */
    private void notifyInterfaceAdded(String iface) {
        final int length = mObservers.beginBroadcast();
        try {
            for (int i = 0; i < length; i++) {
                try {
                    mObservers.getBroadcastItem(i).interfaceAdded(iface);
@@ -309,8 +319,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub
                } catch (RuntimeException e) {
                }
            }
        } finally {
            mObservers.finishBroadcast();
        }
    }

    /**
     * Notify our observers of an interface removal.
@@ -322,6 +334,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
        mActiveQuotas.remove(iface);

        final int length = mObservers.beginBroadcast();
        try {
            for (int i = 0; i < length; i++) {
                try {
                    mObservers.getBroadcastItem(i).interfaceRemoved(iface);
@@ -329,14 +342,17 @@ public class NetworkManagementService extends INetworkManagementService.Stub
                } catch (RuntimeException e) {
                }
            }
        } finally {
            mObservers.finishBroadcast();
        }
    }

    /**
     * Notify our observers of a limit reached.
     */
    private void notifyLimitReached(String limitName, String iface) {
        final int length = mObservers.beginBroadcast();
        try {
            for (int i = 0; i < length; i++) {
                try {
                    mObservers.getBroadcastItem(i).limitReached(limitName, iface);
@@ -344,8 +360,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub
                } catch (RuntimeException e) {
                }
            }
        } finally {
            mObservers.finishBroadcast();
        }
    }

    /**
     * Notify our observers of a change in the data activity state of the interface
@@ -357,6 +375,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
        }

        final int length = mObservers.beginBroadcast();
        try {
            for (int i = 0; i < length; i++) {
                try {
                    mObservers.getBroadcastItem(i).interfaceClassDataActivityChanged(
@@ -365,7 +384,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub
                } catch (RuntimeException e) {
                }
            }
        } finally {
            mObservers.finishBroadcast();
        }

        boolean report = false;
        synchronized (mIdleTimerLock) {
@@ -456,6 +477,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
     */
    private void notifyAddressUpdated(String iface, LinkAddress address) {
        final int length = mObservers.beginBroadcast();
        try {
            for (int i = 0; i < length; i++) {
                try {
                    mObservers.getBroadcastItem(i).addressUpdated(iface, address);
@@ -463,14 +485,17 @@ public class NetworkManagementService extends INetworkManagementService.Stub
                } catch (RuntimeException e) {
                }
            }
        } finally {
            mObservers.finishBroadcast();
        }
    }

    /**
     * Notify our observers of a deleted interface address.
     */
    private void notifyAddressRemoved(String iface, LinkAddress address) {
        final int length = mObservers.beginBroadcast();
        try {
            for (int i = 0; i < length; i++) {
                try {
                    mObservers.getBroadcastItem(i).addressRemoved(iface, address);
@@ -478,23 +503,29 @@ public class NetworkManagementService extends INetworkManagementService.Stub
                } catch (RuntimeException e) {
                }
            }
        } finally {
            mObservers.finishBroadcast();
        }
    }

    /**
     * Notify our observers of DNS server information received.
     */
    private void notifyInterfaceDnsServerInfo(String iface, long lifetime, String[] addresses) {
        final int length = mObservers.beginBroadcast();
        try {
            for (int i = 0; i < length; i++) {
                try {
                mObservers.getBroadcastItem(i).interfaceDnsServerInfo(iface, lifetime, addresses);
                    mObservers.getBroadcastItem(i).interfaceDnsServerInfo(iface, lifetime,
                        addresses);
                } catch (RemoteException e) {
                } catch (RuntimeException e) {
                }
            }
        } finally {
            mObservers.finishBroadcast();
        }
    }

    //
    // Netd Callback handling
@@ -509,7 +540,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
                mConnectedSignal.countDown();
                mConnectedSignal = null;
            } else {
                mMainHandler.post(new Runnable() {
                mFgHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        prepareNativeDaemon();
@@ -1270,7 +1301,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
            if (ConnectivityManager.isNetworkTypeMobile(type)) {
                mNetworkActive = false;
            }
            mMainHandler.post(new Runnable() {
            mFgHandler.post(new Runnable() {
                @Override public void run() {
                    notifyInterfaceClassActivity(type, true, SystemClock.elapsedRealtimeNanos());
                }
@@ -1297,7 +1328,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
                throw e.rethrowAsParcelableException();
            }
            mActiveIdleTimers.remove(iface);
            mMainHandler.post(new Runnable() {
            mFgHandler.post(new Runnable() {
                @Override public void run() {
                    notifyInterfaceClassActivity(params.type, false,
                            SystemClock.elapsedRealtimeNanos());
@@ -1880,6 +1911,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub

    private void reportNetworkActive() {
        final int length = mNetworkActivityListeners.beginBroadcast();
        try {
            for (int i = 0; i < length; i++) {
                try {
                    mNetworkActivityListeners.getBroadcastItem(i).onNetworkActive();
@@ -1887,8 +1919,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub
                } catch (RuntimeException e) {
                }
            }
        } finally {
            mNetworkActivityListeners.finishBroadcast();
        }
    }

    /** {@inheritDoc} */
    @Override