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

Commit be5f0f19 authored by Hugo Benichi's avatar Hugo Benichi Committed by android-build-merger
Browse files

Merge "ConnectivityService: log wakelock activity in dumps" am: db104b23 am:...

Merge "ConnectivityService: log wakelock activity in dumps" am: db104b23 am: 146914c0 am: bf1b181c
am: 7346613f

Change-Id: Id95860ab5d874f24f9fa510a44038ce05bed12f0
parents de7d306d 7346613f
Loading
Loading
Loading
Loading
+52 −67
Original line number Original line Diff line number Diff line
@@ -396,6 +396,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
     */
     */
    private static final int EVENT_REGISTER_NETWORK_LISTENER_WITH_INTENT = 31;
    private static final int EVENT_REGISTER_NETWORK_LISTENER_WITH_INTENT = 31;


    private static String eventName(int what) {
        return sMagicDecoderRing.get(what, Integer.toString(what));
    }

    /** Handler thread used for both of the handlers below. */
    /** Handler thread used for both of the handlers below. */
    @VisibleForTesting
    @VisibleForTesting
    protected final HandlerThread mHandlerThread;
    protected final HandlerThread mHandlerThread;
@@ -408,15 +412,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
    private Intent mInitialBroadcast;
    private Intent mInitialBroadcast;


    private PowerManager.WakeLock mNetTransitionWakeLock;
    private PowerManager.WakeLock mNetTransitionWakeLock;
    private String mNetTransitionWakeLockCausedBy = "";
    private int mNetTransitionWakeLockSerialNumber;
    private int mNetTransitionWakeLockSerialNumber;
    private int mNetTransitionWakeLockTimeout;
    private int mNetTransitionWakeLockTimeout;
    private final PowerManager.WakeLock mPendingIntentWakeLock;
    private final PowerManager.WakeLock mPendingIntentWakeLock;


    // used in DBG mode to track inet condition reports
    private static final int INET_CONDITION_LOG_MAX_SIZE = 15;
    private ArrayList mInetLog;

    // track the current default http proxy - tell the world if we get a new one (real change)
    // track the current default http proxy - tell the world if we get a new one (real change)
    private volatile ProxyInfo mDefaultProxy = null;
    private volatile ProxyInfo mDefaultProxy = null;
    private Object mProxyLock = new Object();
    private Object mProxyLock = new Object();
@@ -458,10 +457,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
    private final LocalLog mNetworkRequestInfoLogs = new LocalLog(MAX_NETWORK_REQUEST_LOGS);
    private final LocalLog mNetworkRequestInfoLogs = new LocalLog(MAX_NETWORK_REQUEST_LOGS);


    // NetworkInfo blocked and unblocked String log entries
    // NetworkInfo blocked and unblocked String log entries
    // TODO: consider reducing memory usage. Each log line is ~40 2B chars, for a total of ~8kB.
    private static final int MAX_NETWORK_INFO_LOGS = 40;
    private static final int MAX_NETWORK_INFO_LOGS = 100;
    private final LocalLog mNetworkInfoBlockingLogs = new LocalLog(MAX_NETWORK_INFO_LOGS);
    private final LocalLog mNetworkInfoBlockingLogs = new LocalLog(MAX_NETWORK_INFO_LOGS);


    private static final int MAX_WAKELOCK_LOGS = 20;
    private final LocalLog mWakelockLogs = new LocalLog(MAX_WAKELOCK_LOGS);

    // Array of <Network,ReadOnlyLocalLogs> tracking network validation and results
    // Array of <Network,ReadOnlyLocalLogs> tracking network validation and results
    private static final int MAX_VALIDATION_LOGS = 10;
    private static final int MAX_VALIDATION_LOGS = 10;
    private static class ValidationLog {
    private static class ValidationLog {
@@ -818,10 +819,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
            loge("Error registering observer :" + e);
            loge("Error registering observer :" + e);
        }
        }


        if (DBG) {
            mInetLog = new ArrayList();
        }

        mSettingsObserver = new SettingsObserver(mContext, mHandler);
        mSettingsObserver = new SettingsObserver(mContext, mHandler);
        registerSettingsCallbacks();
        registerSettingsCallbacks();


@@ -1044,22 +1041,19 @@ public class ConnectivityService extends IConnectivityManager.Stub
        if (ni == null || !LOGD_BLOCKED_NETWORKINFO) {
        if (ni == null || !LOGD_BLOCKED_NETWORKINFO) {
            return;
            return;
        }
        }
        boolean removed = false;
        final boolean blocked;
        boolean added = false;
        synchronized (mBlockedAppUids) {
        synchronized (mBlockedAppUids) {
            if (ni.getDetailedState() == DetailedState.BLOCKED && mBlockedAppUids.add(uid)) {
            if (ni.getDetailedState() == DetailedState.BLOCKED && mBlockedAppUids.add(uid)) {
                added = true;
                blocked = true;
            } else if (ni.isConnected() && mBlockedAppUids.remove(uid)) {
            } else if (ni.isConnected() && mBlockedAppUids.remove(uid)) {
                removed = true;
                blocked = false;
            }
            } else {
                return;
            }
            }
        if (added) {
            log("Returning blocked NetworkInfo to uid=" + uid);
            mNetworkInfoBlockingLogs.log("BLOCKED " + uid);
        } else if (removed) {
            log("Returning unblocked NetworkInfo to uid=" + uid);
            mNetworkInfoBlockingLogs.log("UNBLOCKED " + uid);
        }
        }
        String action = blocked ? "BLOCKED" : "UNBLOCKED";
        log(String.format("Returning %s NetworkInfo to uid=%d", action, uid));
        mNetworkInfoBlockingLogs.log(action + " " + uid);
    }
    }


    /**
    /**
@@ -2023,16 +2017,6 @@ public class ConnectivityService extends IConnectivityManager.Stub


        mLegacyTypeTracker.dump(pw);
        mLegacyTypeTracker.dump(pw);


        synchronized (this) {
            pw.print("mNetTransitionWakeLock: currently " +
                    (mNetTransitionWakeLock.isHeld() ? "" : "not ") + "held");
            if (!TextUtils.isEmpty(mNetTransitionWakeLockCausedBy)) {
                pw.println(", last requested for " + mNetTransitionWakeLockCausedBy);
            } else {
                pw.println(", last requested never");
            }
        }

        pw.println();
        pw.println();
        mTethering.dump(fd, pw, args);
        mTethering.dump(fd, pw, args);


@@ -2042,17 +2026,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
        pw.println();
        pw.println();
        dumpAvoidBadWifiSettings(pw);
        dumpAvoidBadWifiSettings(pw);


        pw.println();
        if (mInetLog != null && mInetLog.size() > 0) {
            pw.println();
            pw.println("Inet condition reports:");
            pw.increaseIndent();
            for(int i = 0; i < mInetLog.size(); i++) {
                pw.println(mInetLog.get(i));
            }
            pw.decreaseIndent();
        }

        if (argsContain(args, "--short") == false) {
        if (argsContain(args, "--short") == false) {
            pw.println();
            pw.println();
            synchronized (mValidationLogs) {
            synchronized (mValidationLogs) {
@@ -2076,6 +2049,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
            pw.increaseIndent();
            pw.increaseIndent();
            mNetworkInfoBlockingLogs.reverseDump(fd, pw, args);
            mNetworkInfoBlockingLogs.reverseDump(fd, pw, args);
            pw.decreaseIndent();
            pw.decreaseIndent();

            pw.println();
            pw.println("NetTransition WakeLock activity (most recent first):");
            pw.increaseIndent();
            mWakelockLogs.reverseDump(fd, pw, args);
            pw.decreaseIndent();
        }
        }
    }
    }


@@ -2084,8 +2063,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
        final NetworkAgentInfo officialNai = getNetworkAgentInfoForNetwork(nai.network);
        final NetworkAgentInfo officialNai = getNetworkAgentInfoForNetwork(nai.network);
        if (officialNai != null && officialNai.equals(nai)) return true;
        if (officialNai != null && officialNai.equals(nai)) return true;
        if (officialNai != null || VDBG) {
        if (officialNai != null || VDBG) {
            final String msg = sMagicDecoderRing.get(what, Integer.toString(what));
            loge(eventName(what) + " - isLiveNetworkAgent found mismatched netId: " + officialNai +
            loge(msg + " - isLiveNetworkAgent found mismatched netId: " + officialNai +
                " - " + nai);
                " - " + nai);
        }
        }
        return false;
        return false;
@@ -2122,8 +2100,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
            NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
            NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
            if (nai == null) {
            if (nai == null) {
                if (VDBG) {
                if (VDBG) {
                    final String what = sMagicDecoderRing.get(msg.what, Integer.toString(msg.what));
                    log(String.format("%s from unknown NetworkAgent", eventName(msg.what)));
                    log(String.format("%s from unknown NetworkAgent", what));
                }
                }
                return;
                return;
            }
            }
@@ -2872,25 +2849,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
            switch (msg.what) {
            switch (msg.what) {
                case EVENT_EXPIRE_NET_TRANSITION_WAKELOCK:
                case EVENT_EXPIRE_NET_TRANSITION_WAKELOCK:
                case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: {
                case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: {
                    String causedBy = null;
                    handleNetworkTransitionWakelockRelease(msg.what, msg.arg1);
                    synchronized (ConnectivityService.this) {
                        if (msg.arg1 == mNetTransitionWakeLockSerialNumber &&
                                mNetTransitionWakeLock.isHeld()) {
                            mNetTransitionWakeLock.release();
                            causedBy = mNetTransitionWakeLockCausedBy;
                        } else {
                            break;
                        }
                    }
                    if (VDBG) {
                        if (msg.what == EVENT_EXPIRE_NET_TRANSITION_WAKELOCK) {
                            log("Failed to find a new network - expiring NetTransition Wakelock");
                        } else {
                            log("NetTransition Wakelock (" +
                                    (causedBy == null ? "unknown" : causedBy) +
                                    " cleared because we found a replacement network");
                        }
                    }
                    break;
                    break;
                }
                }
                case EVENT_APPLY_GLOBAL_HTTP_PROXY: {
                case EVENT_APPLY_GLOBAL_HTTP_PROXY: {
@@ -3129,7 +3088,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
            if (mNetTransitionWakeLock.isHeld()) return;
            if (mNetTransitionWakeLock.isHeld()) return;
            serialNum = ++mNetTransitionWakeLockSerialNumber;
            serialNum = ++mNetTransitionWakeLockSerialNumber;
            mNetTransitionWakeLock.acquire();
            mNetTransitionWakeLock.acquire();
            mNetTransitionWakeLockCausedBy = forWhom;
            mWakelockLogs.log(String.format("ACQUIRE %d for %s", serialNum, forWhom));
        }
        }
        mHandler.sendMessageDelayed(mHandler.obtainMessage(
        mHandler.sendMessageDelayed(mHandler.obtainMessage(
                EVENT_EXPIRE_NET_TRANSITION_WAKELOCK, serialNum, 0),
                EVENT_EXPIRE_NET_TRANSITION_WAKELOCK, serialNum, 0),
@@ -3137,6 +3096,32 @@ public class ConnectivityService extends IConnectivityManager.Stub
        return;
        return;
    }
    }


    private void handleNetworkTransitionWakelockRelease(int eventId, int wantSerialNumber) {
        final int serialNumber;
        final boolean isHeld;
        final boolean release;
        synchronized (this) {
            serialNumber = mNetTransitionWakeLockSerialNumber;
            isHeld = mNetTransitionWakeLock.isHeld();
            release = (wantSerialNumber == serialNumber) && isHeld;
            if (release) {
                mNetTransitionWakeLock.release();
            }
        }
        final String result;
        if (release) {
            result = "released";
        } else if (!isHeld) {
            result = "already released";
        } else {
            result = String.format("not released (serial number was %d)", serialNumber);
        }
        String msg = String.format(
                "RELEASE %d by %s: %s", wantSerialNumber, eventName(eventId), result);
        mWakelockLogs.log(msg);
        if (DBG) log(msg);
    }

    // 100 percent is full good, 0 is full bad.
    // 100 percent is full good, 0 is full bad.
    @Override
    @Override
    public void reportInetCondition(int networkType, int percentage) {
    public void reportInetCondition(int networkType, int percentage) {