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

Commit 80330819 authored by Vova Sharaienko's avatar Vova Sharaienko Committed by Automerger Merge Worker
Browse files

Merge "MobileDataStatsPuller: add rate limit before post msg to handler" into main am: 74a019cf

parents f6684775 74a019cf
Loading
Loading
Loading
Loading
+44 −44
Original line number Diff line number Diff line
@@ -142,11 +142,8 @@ class AggregatedMobileDataStatsPuller {
    private final RateLimiter mRateLimiter;

    AggregatedMobileDataStatsPuller(@NonNull NetworkStatsManager networkStatsManager) {
        if (DEBUG) {
            if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) {
                Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER,
                        TAG + "-AggregatedMobileDataStatsPullerInit");
            }
        if (DEBUG && Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) {
            Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, TAG + "-Init");
        }

        mRateLimiter = new RateLimiter(/* window= */ Duration.ofSeconds(1));
@@ -173,10 +170,16 @@ class AggregatedMobileDataStatsPuller {

    public void noteUidProcessState(int uid, int state, long unusedElapsedRealtime,
                                    long unusedUptime) {
        if (mRateLimiter.tryAcquire()) {
            mMobileDataStatsHandler.post(
                () -> {
                    noteUidProcessStateImpl(uid, state);
                });
        } else {
            synchronized (mLock) {
                mUidPreviousState.put(uid, state);
            }
        }
    }

    public int pullDataBytesTransfer(List<StatsEvent> data) {
@@ -209,7 +212,6 @@ class AggregatedMobileDataStatsPuller {
    }

    private void noteUidProcessStateImpl(int uid, int state) {
        if (mRateLimiter.tryAcquire()) {
        // noteUidProcessStateImpl can be called back to back several times while
        // the updateNetworkStats loops over several stats for multiple uids
        // and during the first call in a batch of proc state change event it can
@@ -223,16 +225,15 @@ class AggregatedMobileDataStatsPuller {
        } else {
            Slog.w(TAG, "noteUidProcessStateLocked() can not get mNetworkStatsManager");
        }
        }
        synchronized (mLock) {
            mUidPreviousState.put(uid, state);
        }
    }

    private void updateNetworkStats(NetworkStatsManager networkStatsManager) {
        if (DEBUG) {
            if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) {
        if (DEBUG && Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) {
            Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, TAG + "-updateNetworkStats");
        }
        }

        final NetworkStats latestStats = networkStatsManager.getMobileUidStats();
        if (isEmpty(latestStats)) {
@@ -256,11 +257,12 @@ class AggregatedMobileDataStatsPuller {
    }

    private void updateNetworkStatsDelta(NetworkStats delta) {
        if (DEBUG && Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) {
            Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, TAG + "-updateNetworkStatsDelta");
        }
        synchronized (mLock) {
            for (NetworkStats.Entry entry : delta) {
                if (entry.getRxPackets() == 0 && entry.getTxPackets() == 0) {
                    continue;
                }
                if (entry.getRxPackets() != 0 || entry.getTxPackets() != 0) {
                    MobileDataStats stats = getUidStatsForPreviousStateLocked(entry.getUid());
                    if (stats != null) {
                        stats.addTxBytes(entry.getTxBytes());
@@ -271,6 +273,10 @@ class AggregatedMobileDataStatsPuller {
                }
            }
        }
        if (DEBUG) {
            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
        }
    }

    @GuardedBy("mLock")
    private int pullDataBytesTransferLocked(List<StatsEvent> pulledData) {
@@ -298,18 +304,12 @@ class AggregatedMobileDataStatsPuller {
    }

    private static boolean isEmpty(NetworkStats stats) {
        long totalRxPackets = 0;
        long totalTxPackets = 0;
        for (NetworkStats.Entry entry : stats) {
            if (entry.getRxPackets() == 0 && entry.getTxPackets() == 0) {
                continue;
            }
            totalRxPackets += entry.getRxPackets();
            totalTxPackets += entry.getTxPackets();
            if (entry.getRxPackets() != 0 || entry.getTxPackets() != 0) {
                // at least one non empty entry located
            break;
                return false;
            }
        }
        final long totalPackets = totalRxPackets + totalTxPackets;
        return totalPackets == 0;
        return true;
    }
}