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

Commit c715b531 authored by Vova Sharaienko's avatar Vova Sharaienko Committed by Android (Google) Code Review
Browse files

Merge "AggregatedMobileDataStatsPuller improved performance" into main

parents efa3d09f 64cbb90c
Loading
Loading
Loading
Loading
+37 −16
Original line number Original line Diff line number Diff line
@@ -30,7 +30,9 @@ import android.util.StatsEvent;


import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.FrameworkStatsLog;
import com.android.server.selinux.RateLimiter;


import java.time.Duration;
import java.util.List;
import java.util.List;
import java.util.Map;
import java.util.Map;


@@ -131,19 +133,36 @@ class AggregatedMobileDataStatsPuller {


    private final Handler mMobileDataStatsHandler;
    private final Handler mMobileDataStatsHandler;


    private final RateLimiter mRateLimiter;

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

        mRateLimiter = new RateLimiter(/* window= */ Duration.ofSeconds(1));

        mUidStats = new ArrayMap<>();
        mUidStats = new ArrayMap<>();
        mUidPreviousState = new SparseIntArray();
        mUidPreviousState = new SparseIntArray();


        mNetworkStatsManager = networkStatsManager;
        mNetworkStatsManager = networkStatsManager;


        if (mNetworkStatsManager != null) {
            updateNetworkStats(mNetworkStatsManager);
        }

        HandlerThread mMobileDataStatsHandlerThread = new HandlerThread("MobileDataStatsHandler");
        HandlerThread mMobileDataStatsHandlerThread = new HandlerThread("MobileDataStatsHandler");
        mMobileDataStatsHandlerThread.start();
        mMobileDataStatsHandlerThread.start();
        mMobileDataStatsHandler = new Handler(mMobileDataStatsHandlerThread.getLooper());
        mMobileDataStatsHandler = new Handler(mMobileDataStatsHandlerThread.getLooper());

        if (mNetworkStatsManager != null) {
            mMobileDataStatsHandler.post(
                    () -> {
                        updateNetworkStats(mNetworkStatsManager);
                    });
        }
        if (DEBUG) {
            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
        }
    }
    }


    public void noteUidProcessState(int uid, int state, long unusedElapsedRealtime,
    public void noteUidProcessState(int uid, int state, long unusedElapsedRealtime,
@@ -180,8 +199,9 @@ class AggregatedMobileDataStatsPuller {
    }
    }


    private void noteUidProcessStateImpl(int uid, int state) {
    private void noteUidProcessStateImpl(int uid, int state) {
        // noteUidProcessStateLocked can be called back to back several times while
        if (mRateLimiter.tryAcquire()) {
        // the updateNetworkStatsLocked loops over several stats for multiple uids
            // 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
            // and during the first call in a batch of proc state change event it can
            // contain info for uid with unknown previous state yet which can happen due to a few
            // contain info for uid with unknown previous state yet which can happen due to a few
            // reasons:
            // reasons:
@@ -193,6 +213,7 @@ class AggregatedMobileDataStatsPuller {
            } else {
            } else {
                Slog.w(TAG, "noteUidProcessStateLocked() can not get mNetworkStatsManager");
                Slog.w(TAG, "noteUidProcessStateLocked() can not get mNetworkStatsManager");
            }
            }
        }
        mUidPreviousState.put(uid, state);
        mUidPreviousState.put(uid, state);
    }
    }